annotate src/regex.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents d423b5ec9091
children df5046c4e18b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1 /* Extended regular expression matching and search library,
2454
d77bb274b15c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2453
diff changeset
2 version 0.12.
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3 (Implements POSIX draft P10003.2/D11.2, except for
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4 internationalization features.)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5
1738
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
6 Copyright (C) 1993 Free Software Foundation, Inc.
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
7
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
11 any later version.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
12
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
16 GNU General Public License for more details.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
17
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
19 along with this program; if not, write to the Free Software
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
21
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
22 /* AIX requires this to be the first thing in the file. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
23 #if defined (_AIX) && !defined (REGEX_MALLOC)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
24 #pragma alloca
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
25 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
26
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
27 #define _GNU_SOURCE
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
28
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
29 /* We need this for `regex.h', and perhaps for the Emacs include files. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
30 #include <sys/types.h>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
31
1669
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
32 #ifdef HAVE_CONFIG_H
1645
fb092d69da76 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1642
diff changeset
33 #include "config.h"
fb092d69da76 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1642
diff changeset
34 #endif
fb092d69da76 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1642
diff changeset
35
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
36 /* The `emacs' switch turns on certain matching commands
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
37 that make sense only in Emacs. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
38 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
39
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
40 #include "lisp.h"
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
41 #include "buffer.h"
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
42 #include "syntax.h"
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
43
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
44 /* Emacs uses `NULL' as a predicate. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
45 #undef NULL
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
46
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
47 #else /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
48
3766
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
49 #ifdef STDC_HEADERS
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
50 #include <stdlib.h>
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
51 #else
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
52 char *malloc ();
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
53 char *realloc ();
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
54 #endif
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
55
d423b5ec9091 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3614
diff changeset
56
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
57 /* We used to test for `BSTRING' here, but only GCC and Emacs define
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
58 `BSTRING', as far as I know, and neither of them use this code. */
1641
47ae0840b2b9 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1637
diff changeset
59 #if HAVE_STRING_H || STDC_HEADERS
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
60 #include <string.h>
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
61 #ifndef bcmp
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
62 #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
63 #endif
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
64 #ifndef bcopy
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
65 #define bcopy(s, d, n) memcpy ((d), (s), (n))
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
66 #endif
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
67 #ifndef bzero
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
68 #define bzero(s, n) memset ((s), 0, (n))
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
69 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
70 #else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
71 #include <strings.h>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
72 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
73
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
74 /* Define the syntax stuff for \<, \>, etc. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
75
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
76 /* This must be nonzero for the wordchar and notwordchar pattern
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
77 commands in re_match_2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
78 #ifndef Sword
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
79 #define Sword 1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
80 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
81
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
82 #ifdef SYNTAX_TABLE
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
83
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
84 extern char *re_syntax_table;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
85
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
86 #else /* not SYNTAX_TABLE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
87
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
88 /* How many characters in the character set. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
89 #define CHAR_SET_SIZE 256
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
90
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
91 static char re_syntax_table[CHAR_SET_SIZE];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
92
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
93 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
94 init_syntax_once ()
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
95 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
96 register int c;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
97 static int done = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
98
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
99 if (done)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
100 return;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
101
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
102 bzero (re_syntax_table, sizeof re_syntax_table);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
103
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
104 for (c = 'a'; c <= 'z'; c++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
105 re_syntax_table[c] = Sword;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
106
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
107 for (c = 'A'; c <= 'Z'; c++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
108 re_syntax_table[c] = Sword;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
109
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
110 for (c = '0'; c <= '9'; c++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
111 re_syntax_table[c] = Sword;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
112
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
113 re_syntax_table['_'] = Sword;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
114
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
115 done = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
116 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
117
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
118 #endif /* not SYNTAX_TABLE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
119
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
120 #define SYNTAX(c) re_syntax_table[c]
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
121
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
122 #endif /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
123
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
124 /* Get the interface, including the syntax bits. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
125 #include "regex.h"
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
126
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
127 /* isalpha etc. are used for the character classes. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
128 #include <ctype.h>
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
129
2465
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
130 /* Jim Meyering writes:
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
131
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
132 "... Some ctype macros are valid only for character codes that
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
133 isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
134 using /bin/cc or gcc but without giving an ansi option). So, all
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
135 ctype uses should be through macros like ISPRINT... If
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
136 STDC_HEADERS is defined, then autoconf has verified that the ctype
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
137 macros don't need to be guarded with references to isascii. ...
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
138 Defining isascii to 1 should let any compiler worth its salt
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
139 eliminate the && through constant folding." */
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
140 #if ! defined (isascii) || defined (STDC_HEADERS)
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
141 #undef isascii
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
142 #define isascii(c) 1
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
143 #endif
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
144
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
145 #ifdef isblank
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
146 #define ISBLANK(c) (isascii (c) && isblank (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
147 #else
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
148 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
149 #endif
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
150 #ifdef isgraph
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
151 #define ISGRAPH(c) (isascii (c) && isgraph (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
152 #else
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
153 #define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
154 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
155
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
156 #define ISPRINT(c) (isascii (c) && isprint (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
157 #define ISDIGIT(c) (isascii (c) && isdigit (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
158 #define ISALNUM(c) (isascii (c) && isalnum (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
159 #define ISALPHA(c) (isascii (c) && isalpha (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
160 #define ISCNTRL(c) (isascii (c) && iscntrl (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
161 #define ISLOWER(c) (isascii (c) && islower (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
162 #define ISPUNCT(c) (isascii (c) && ispunct (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
163 #define ISSPACE(c) (isascii (c) && isspace (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
164 #define ISUPPER(c) (isascii (c) && isupper (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
165 #define ISXDIGIT(c) (isascii (c) && isxdigit (c))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
166
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
167 #ifndef NULL
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
168 #define NULL 0
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
169 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
170
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
171 /* We remove any previous definition of `SIGN_EXTEND_CHAR',
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
172 since ours (we hope) works properly with all combinations of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
173 machines, compilers, `char' and `unsigned char' argument types.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
174 (Per Bothner suggested the basic approach.) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
175 #undef SIGN_EXTEND_CHAR
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
176 #if __STDC__
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
177 #define SIGN_EXTEND_CHAR(c) ((signed char) (c))
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
178 #else /* not __STDC__ */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
179 /* As in Harbison and Steele. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
180 #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
181 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
182
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
183 /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
184 use `alloca' instead of `malloc'. This is because using malloc in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
185 re_search* or re_match* could cause memory leaks when C-g is used in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
186 Emacs; also, malloc is slower and causes storage fragmentation. On
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
187 the other hand, malloc is more portable, and easier to debug.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
188
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
189 Because we sometimes use alloca, some routines have to be macros,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
190 not functions -- `alloca'-allocated space disappears at the end of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
191 function it is called in. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
192
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
193 #ifdef REGEX_MALLOC
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
194
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
195 #define REGEX_ALLOCATE malloc
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
196 #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
197
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
198 #else /* not REGEX_MALLOC */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
199
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
200 /* Emacs already defines alloca, sometimes. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
201 #ifndef alloca
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
202
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
203 /* Make alloca work the best possible way. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
204 #ifdef __GNUC__
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
205 #define alloca __builtin_alloca
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
206 #else /* not __GNUC__ */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
207 #if HAVE_ALLOCA_H
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
208 #include <alloca.h>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
209 #else /* not __GNUC__ or HAVE_ALLOCA_H */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
210 #ifndef _AIX /* Already did AIX, up at the top. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
211 char *alloca ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
212 #endif /* not _AIX */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
213 #endif /* not HAVE_ALLOCA_H */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
214 #endif /* not __GNUC__ */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
215
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
216 #endif /* not alloca */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
217
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
218 #define REGEX_ALLOCATE alloca
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
219
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
220 /* Assumes a `char *destination' variable. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
221 #define REGEX_REALLOCATE(source, osize, nsize) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
222 (destination = (char *) alloca (nsize), \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
223 bcopy (source, destination, osize), \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
224 destination)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
225
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
226 #endif /* not REGEX_MALLOC */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
227
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
228
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
229 /* True if `size1' is non-NULL and PTR is pointing anywhere inside
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
230 `string1' or just past its end. This works if PTR is NULL, which is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
231 a good thing. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
232 #define FIRST_STRING_P(ptr) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
233 (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
234
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
235 /* (Re)Allocate N items of type T using malloc, or fail. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
236 #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
237 #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
238 #define RETALLOC_IF(addr, n, t) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
239 if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
240 #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
241
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
242 #define BYTEWIDTH 8 /* In bits. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
243
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
244 #define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
245
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
246 #define MAX(a, b) ((a) > (b) ? (a) : (b))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
247 #define MIN(a, b) ((a) < (b) ? (a) : (b))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
248
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
249 typedef char boolean;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
250 #define false 0
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
251 #define true 1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
252
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
253 /* These are the command codes that appear in compiled regular
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
254 expressions. Some opcodes are followed by argument bytes. A
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
255 command code can specify any interpretation whatsoever for its
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
256 arguments. Zero bytes may appear in the compiled regular expression.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
257
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
258 The value of `exactn' is needed in search.c (search_buffer) in Emacs.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
259 So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
260 `exactn' we use here must also be 1. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
261
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
262 typedef enum
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
263 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
264 no_op = 0,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
265
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
266 /* Followed by one byte giving n, then by n literal bytes. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
267 exactn = 1,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
268
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
269 /* Matches any (more or less) character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
270 anychar,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
271
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
272 /* Matches any one char belonging to specified set. First
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
273 following byte is number of bitmap bytes. Then come bytes
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
274 for a bitmap saying which chars are in. Bits in each byte
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
275 are ordered low-bit-first. A character is in the set if its
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
276 bit is 1. A character too large to have a bit in the map is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
277 automatically not in the set. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
278 charset,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
279
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
280 /* Same parameters as charset, but match any character that is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
281 not one of those specified. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
282 charset_not,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
283
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
284 /* Start remembering the text that is matched, for storing in a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
285 register. Followed by one byte with the register number, in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
286 the range 0 to one less than the pattern buffer's re_nsub
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
287 field. Then followed by one byte with the number of groups
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
288 inner to this one. (This last has to be part of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
289 start_memory only because we need it in the on_failure_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
290 of re_match_2.) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
291 start_memory,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
292
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
293 /* Stop remembering the text that is matched and store it in a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
294 memory register. Followed by one byte with the register
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
295 number, in the range 0 to one less than `re_nsub' in the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
296 pattern buffer, and one byte with the number of inner groups,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
297 just like `start_memory'. (We need the number of inner
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
298 groups here because we don't have any easy way of finding the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
299 corresponding start_memory when we're at a stop_memory.) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
300 stop_memory,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
301
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
302 /* Match a duplicate of something remembered. Followed by one
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
303 byte containing the register number. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
304 duplicate,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
305
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
306 /* Fail unless at beginning of line. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
307 begline,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
308
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
309 /* Fail unless at end of line. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
310 endline,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
311
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
312 /* Succeeds if at beginning of buffer (if emacs) or at beginning
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
313 of string to be matched (if not). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
314 begbuf,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
315
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
316 /* Analogously, for end of buffer/string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
317 endbuf,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
318
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
319 /* Followed by two byte relative address to which to jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
320 jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
321
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
322 /* Same as jump, but marks the end of an alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
323 jump_past_alt,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
324
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
325 /* Followed by two-byte relative address of place to resume at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
326 in case of failure. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
327 on_failure_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
328
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
329 /* Like on_failure_jump, but pushes a placeholder instead of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
330 current string position when executed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
331 on_failure_keep_string_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
332
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
333 /* Throw away latest failure point and then jump to following
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
334 two-byte relative address. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
335 pop_failure_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
336
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
337 /* Change to pop_failure_jump if know won't have to backtrack to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
338 match; otherwise change to jump. This is used to jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
339 back to the beginning of a repeat. If what follows this jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
340 clearly won't match what the repeat does, such that we can be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
341 sure that there is no use backtracking out of repetitions
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
342 already matched, then we change it to a pop_failure_jump.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
343 Followed by two-byte address. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
344 maybe_pop_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
345
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
346 /* Jump to following two-byte address, and push a dummy failure
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
347 point. This failure point will be thrown away if an attempt
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
348 is made to use it for a failure. A `+' construct makes this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
349 before the first repeat. Also used as an intermediary kind
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
350 of jump when compiling an alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
351 dummy_failure_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
352
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
353 /* Push a dummy failure point and continue. Used at the end of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
354 alternatives. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
355 push_dummy_failure,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
356
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
357 /* Followed by two-byte relative address and two-byte number n.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
358 After matching N times, jump to the address upon failure. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
359 succeed_n,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
360
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
361 /* Followed by two-byte relative address, and two-byte number n.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
362 Jump to the address N times, then fail. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
363 jump_n,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
364
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
365 /* Set the following two-byte relative address to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
366 subsequent two-byte number. The address *includes* the two
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
367 bytes of number. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
368 set_number_at,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
369
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
370 wordchar, /* Matches any word-constituent character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
371 notwordchar, /* Matches any char that is not a word-constituent. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
372
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
373 wordbeg, /* Succeeds if at word beginning. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
374 wordend, /* Succeeds if at word end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
375
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
376 wordbound, /* Succeeds if at a word boundary. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
377 notwordbound /* Succeeds if not at a word boundary. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
378
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
379 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
380 ,before_dot, /* Succeeds if before point. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
381 at_dot, /* Succeeds if at point. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
382 after_dot, /* Succeeds if after point. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
383
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
384 /* Matches any character whose syntax is specified. Followed by
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
385 a byte which contains a syntax code, e.g., Sword. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
386 syntaxspec,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
387
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
388 /* Matches any character whose syntax is not that specified. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
389 notsyntaxspec
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
390 #endif /* emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
391 } re_opcode_t;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
392
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
393 /* Common operations on the compiled pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
394
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
395 /* Store NUMBER in two contiguous bytes starting at DESTINATION. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
396
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
397 #define STORE_NUMBER(destination, number) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
398 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
399 (destination)[0] = (number) & 0377; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
400 (destination)[1] = (number) >> 8; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
401 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
402
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
403 /* Same as STORE_NUMBER, except increment DESTINATION to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
404 the byte after where the number is stored. Therefore, DESTINATION
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
405 must be an lvalue. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
406
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
407 #define STORE_NUMBER_AND_INCR(destination, number) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
408 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
409 STORE_NUMBER (destination, number); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
410 (destination) += 2; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
411 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
412
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
413 /* Put into DESTINATION a number stored in two contiguous bytes starting
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
414 at SOURCE. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
415
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
416 #define EXTRACT_NUMBER(destination, source) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
417 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
418 (destination) = *(source) & 0377; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
419 (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
420 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
421
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
422 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
423 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
424 extract_number (dest, source)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
425 int *dest;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
426 unsigned char *source;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
427 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
428 int temp = SIGN_EXTEND_CHAR (*(source + 1));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
429 *dest = *source & 0377;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
430 *dest += temp << 8;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
431 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
432
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
433 #ifndef EXTRACT_MACROS /* To debug the macros. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
434 #undef EXTRACT_NUMBER
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
435 #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
436 #endif /* not EXTRACT_MACROS */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
437
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
438 #endif /* DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
439
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
440 /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
441 SOURCE must be an lvalue. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
442
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
443 #define EXTRACT_NUMBER_AND_INCR(destination, source) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
444 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
445 EXTRACT_NUMBER (destination, source); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
446 (source) += 2; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
447 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
448
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
449 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
450 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
451 extract_number_and_incr (destination, source)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
452 int *destination;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
453 unsigned char **source;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
454 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
455 extract_number (destination, *source);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
456 *source += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
457 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
458
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
459 #ifndef EXTRACT_MACROS
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
460 #undef EXTRACT_NUMBER_AND_INCR
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
461 #define EXTRACT_NUMBER_AND_INCR(dest, src) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
462 extract_number_and_incr (&dest, &src)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
463 #endif /* not EXTRACT_MACROS */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
464
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
465 #endif /* DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
466
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
467 /* If DEBUG is defined, Regex prints many voluminous messages about what
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
468 it is doing (if the variable `debug' is nonzero). If linked with the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
469 main program in `iregex.c', you can enter patterns and strings
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
470 interactively. And if linked with the main program in `main.c' and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
471 the other test files, you can run the already-written tests. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
472
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
473 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
474
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
475 /* We use standard I/O for debugging. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
476 #include <stdio.h>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
477
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
478 /* It is useful to test things that ``must'' be true when debugging. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
479 #include <assert.h>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
480
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
481 static int debug = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
482
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
483 #define DEBUG_STATEMENT(e) e
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
484 #define DEBUG_PRINT1(x) if (debug) printf (x)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
485 #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
486 #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
487 #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
488 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
489 if (debug) print_partial_compiled_pattern (s, e)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
490 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
491 if (debug) print_double_string (w, s1, sz1, s2, sz2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
492
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
493
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
494 extern void printchar ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
495
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
496 /* Print the fastmap in human-readable form. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
497
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
498 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
499 print_fastmap (fastmap)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
500 char *fastmap;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
501 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
502 unsigned was_a_range = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
503 unsigned i = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
504
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
505 while (i < (1 << BYTEWIDTH))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
506 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
507 if (fastmap[i++])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
508 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
509 was_a_range = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
510 printchar (i - 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
511 while (i < (1 << BYTEWIDTH) && fastmap[i])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
512 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
513 was_a_range = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
514 i++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
515 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
516 if (was_a_range)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
517 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
518 printf ("-");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
519 printchar (i - 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
520 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
521 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
522 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
523 putchar ('\n');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
524 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
525
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
526
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
527 /* Print a compiled pattern string in human-readable form, starting at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
528 the START pointer into it and ending just before the pointer END. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
529
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
530 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
531 print_partial_compiled_pattern (start, end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
532 unsigned char *start;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
533 unsigned char *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
534 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
535 int mcnt, mcnt2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
536 unsigned char *p = start;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
537 unsigned char *pend = end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
538
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
539 if (start == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
540 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
541 printf ("(null)\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
542 return;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
543 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
544
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
545 /* Loop over pattern commands. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
546 while (p < pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
547 {
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
548 printf ("%d:\t", p - start);
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
549
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
550 switch ((re_opcode_t) *p++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
551 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
552 case no_op:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
553 printf ("/no_op");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
554 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
555
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
556 case exactn:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
557 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
558 printf ("/exactn/%d", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
559 do
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
560 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
561 putchar ('/');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
562 printchar (*p++);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
563 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
564 while (--mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
565 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
566
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
567 case start_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
568 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
569 printf ("/start_memory/%d/%d", mcnt, *p++);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
570 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
571
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
572 case stop_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
573 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
574 printf ("/stop_memory/%d/%d", mcnt, *p++);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
575 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
576
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
577 case duplicate:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
578 printf ("/duplicate/%d", *p++);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
579 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
580
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
581 case anychar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
582 printf ("/anychar");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
583 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
584
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
585 case charset:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
586 case charset_not:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
587 {
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
588 register int c, last = -100;
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
589 register int in_range = 0;
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
590
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
591 printf ("/charset [%s",
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
592 (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
593
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
594 assert (p + *p < pend);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
595
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
596 for (c = 0; c < 256; c++)
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
597 if (c / 8 < *p
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
598 && (p[1 + (c/8)] & (1 << (c % 8))))
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
599 {
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
600 /* Are we starting a range? */
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
601 if (last + 1 == c && ! in_range)
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
602 {
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
603 putchar ('-');
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
604 in_range = 1;
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
605 }
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
606 /* Have we broken a range? */
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
607 else if (last + 1 != c && in_range)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
608 {
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
609 printchar (last);
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
610 in_range = 0;
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
611 }
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
612
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
613 if (! in_range)
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
614 printchar (c);
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
616 last = c;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
617 }
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
618
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
619 if (in_range)
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
620 printchar (last);
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
621
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
622 putchar (']');
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
623
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
624 p += 1 + *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
625 }
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
626 break;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
627
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
628 case begline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
629 printf ("/begline");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
630 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
631
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
632 case endline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
633 printf ("/endline");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
634 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
635
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
636 case on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
637 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
638 printf ("/on_failure_jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
639 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
640
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
641 case on_failure_keep_string_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
642 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
643 printf ("/on_failure_keep_string_jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
644 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
645
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
646 case dummy_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
647 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
648 printf ("/dummy_failure_jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
649 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
650
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
651 case push_dummy_failure:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
652 printf ("/push_dummy_failure");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
653 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
654
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
655 case maybe_pop_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
656 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
657 printf ("/maybe_pop_jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
658 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
659
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
660 case pop_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
661 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
662 printf ("/pop_failure_jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
663 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
664
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
665 case jump_past_alt:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
666 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
667 printf ("/jump_past_alt to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
668 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
669
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
670 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
671 extract_number_and_incr (&mcnt, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
672 printf ("/jump to %d", p + mcnt - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
673 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
674
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
675 case succeed_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
676 extract_number_and_incr (&mcnt, &p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
677 extract_number_and_incr (&mcnt2, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
678 printf ("/succeed_n to %d, %d times", p + mcnt - start, mcnt2);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
679 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
680
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
681 case jump_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
682 extract_number_and_incr (&mcnt, &p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
683 extract_number_and_incr (&mcnt2, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
684 printf ("/jump_n to %d, %d times", p + mcnt - start, mcnt2);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
685 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
686
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
687 case set_number_at:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
688 extract_number_and_incr (&mcnt, &p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
689 extract_number_and_incr (&mcnt2, &p);
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
690 printf ("/set_number_at location %d to %d", p + mcnt - start, mcnt2);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
691 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
692
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
693 case wordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
694 printf ("/wordbound");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
695 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
696
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
697 case notwordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
698 printf ("/notwordbound");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
699 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
700
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
701 case wordbeg:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
702 printf ("/wordbeg");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
703 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
704
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
705 case wordend:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
706 printf ("/wordend");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
707
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
708 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
709 case before_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
710 printf ("/before_dot");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
711 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
712
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
713 case at_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
714 printf ("/at_dot");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
715 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
716
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
717 case after_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
718 printf ("/after_dot");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
719 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
720
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
721 case syntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
722 printf ("/syntaxspec");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
723 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
724 printf ("/%d", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
725 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
726
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
727 case notsyntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
728 printf ("/notsyntaxspec");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
729 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
730 printf ("/%d", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
731 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
732 #endif /* emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
733
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
734 case wordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
735 printf ("/wordchar");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
736 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
737
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
738 case notwordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
739 printf ("/notwordchar");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
740 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
741
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
742 case begbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
743 printf ("/begbuf");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
744 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
745
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
746 case endbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
747 printf ("/endbuf");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
748 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
749
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
750 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
751 printf ("?%d", *(p-1));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
752 }
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
753
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
754 putchar ('\n');
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
755 }
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
756
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
757 printf ("%d:\tend of pattern.\n", p - start);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
758 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
759
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
760
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
761 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
762 print_compiled_pattern (bufp)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
763 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
764 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
765 unsigned char *buffer = bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
766
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
767 print_partial_compiled_pattern (buffer, buffer + bufp->used);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
768 printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
769
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
770 if (bufp->fastmap_accurate && bufp->fastmap)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
771 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
772 printf ("fastmap: ");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
773 print_fastmap (bufp->fastmap);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
774 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
775
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
776 printf ("re_nsub: %d\t", bufp->re_nsub);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
777 printf ("regs_alloc: %d\t", bufp->regs_allocated);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
778 printf ("can_be_null: %d\t", bufp->can_be_null);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
779 printf ("newline_anchor: %d\n", bufp->newline_anchor);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
780 printf ("no_sub: %d\t", bufp->no_sub);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
781 printf ("not_bol: %d\t", bufp->not_bol);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
782 printf ("not_eol: %d\t", bufp->not_eol);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
783 printf ("syntax: %d\n", bufp->syntax);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
784 /* Perhaps we should print the translate table? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
785 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
786
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
787
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
788 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
789 print_double_string (where, string1, size1, string2, size2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
790 const char *where;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
791 const char *string1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
792 const char *string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
793 int size1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
794 int size2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
795 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
796 unsigned this_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
797
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
798 if (where == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
799 printf ("(null)");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
800 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
801 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
802 if (FIRST_STRING_P (where))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
803 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
804 for (this_char = where - string1; this_char < size1; this_char++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
805 printchar (string1[this_char]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
806
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
807 where = string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
808 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
809
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
810 for (this_char = where - string2; this_char < size2; this_char++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
811 printchar (string2[this_char]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
812 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
813 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
814
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
815 #else /* not DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
816
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
817 #undef assert
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
818 #define assert(e)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
819
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
820 #define DEBUG_STATEMENT(e)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
821 #define DEBUG_PRINT1(x)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
822 #define DEBUG_PRINT2(x1, x2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
823 #define DEBUG_PRINT3(x1, x2, x3)
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
824 #define DEBUG_PRINT4(x1, x2, x3, x4)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
825 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
826 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
827
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
828 #endif /* not DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
829
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
830 /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
831 also be assigned to arbitrarily: each pattern buffer stores its own
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
832 syntax, so it can be changed between regex compilations. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
833 reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
834
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
835
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
836 /* Specify the precise syntax of regexps for compilation. This provides
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
837 for compatibility for various utilities which historically have
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
838 different, incompatible syntaxes.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
839
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
840 The argument SYNTAX is a bit mask comprised of the various bits
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
841 defined in regex.h. We return the old syntax. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
842
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
843 reg_syntax_t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
844 re_set_syntax (syntax)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
845 reg_syntax_t syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
846 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
847 reg_syntax_t ret = re_syntax_options;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
848
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
849 re_syntax_options = syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
850 return ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
851 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
852
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
853 /* This table gives an error message for each of the error codes listed
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
854 in regex.h. Obviously the order here has to be same as there. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
855
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
856 static const char *re_error_msg[] =
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
857 { NULL, /* REG_NOERROR */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
858 "No match", /* REG_NOMATCH */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
859 "Invalid regular expression", /* REG_BADPAT */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
860 "Invalid collation character", /* REG_ECOLLATE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
861 "Invalid character class name", /* REG_ECTYPE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
862 "Trailing backslash", /* REG_EESCAPE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
863 "Invalid back reference", /* REG_ESUBREG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
864 "Unmatched [ or [^", /* REG_EBRACK */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
865 "Unmatched ( or \\(", /* REG_EPAREN */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
866 "Unmatched \\{", /* REG_EBRACE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
867 "Invalid content of \\{\\}", /* REG_BADBR */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
868 "Invalid range end", /* REG_ERANGE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
869 "Memory exhausted", /* REG_ESPACE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
870 "Invalid preceding regular expression", /* REG_BADRPT */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
871 "Premature end of regular expression", /* REG_EEND */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
872 "Regular expression too big", /* REG_ESIZE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
873 "Unmatched ) or \\)", /* REG_ERPAREN */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
874 };
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
875
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
876 /* Avoiding alloca during matching, to placate r_alloc. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
877
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
878 /* Define MATCH_MAY_ALLOCATE if we need to make sure that the
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
879 searching and matching functions should not call alloca. On some
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
880 systems, alloca is implemented in terms of malloc, and if we're
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
881 using the relocating allocator routines, then malloc could cause a
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
882 relocation, which might (if the strings being searched are in the
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
883 ralloc heap) shift the data out from underneath the regexp
3614
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
884 routines.
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
885
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
886 Here's another reason to avoid allocation: Emacs insists on
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
887 processing input from X in a signal handler; processing X input may
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
888 call malloc; if input arrives while a matching routine is calling
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
889 malloc, then we're scrod. But Emacs can't just block input while
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
890 calling matching routines; then we don't notice interrupts when
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
891 they come in. So, Emacs blocks input around all regexp calls
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
892 except the matching calls, which it leaves unprotected, in the
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
893 faith that they will not malloc. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
894
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
895 /* Normally, this is fine. */
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
896 #define MATCH_MAY_ALLOCATE
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
897
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
898 /* But under some circumstances, it's not. */
3614
00fa1b757db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 3541
diff changeset
899 #if defined (emacs) || (defined (REL_ALLOC) && defined (C_ALLOCA))
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
900 #undef MATCH_MAY_ALLOCATE
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
901 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
902
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
903
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
904 /* Failure stack declarations and macros; both re_compile_fastmap and
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
905 re_match_2 use a failure stack. These have to be macros because of
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
906 REGEX_ALLOCATE. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
907
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
908
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
909 /* Number of failure points for which to initially allocate space
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
910 when matching. If this number is exceeded, we allocate more
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
911 space, so it is not a hard limit. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
912 #ifndef INIT_FAILURE_ALLOC
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
913 #define INIT_FAILURE_ALLOC 5
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
914 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
915
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
916 /* Roughly the maximum number of failure points on the stack. Would be
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
917 exactly that if always used MAX_FAILURE_SPACE each time we failed.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
918 This is a variable only so users of regex can assign to it; we never
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
919 change it ourselves. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
920 int re_max_failures = 2000;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
921
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
922 typedef const unsigned char *fail_stack_elt_t;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
923
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
924 typedef struct
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
925 {
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
926 fail_stack_elt_t *stack;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
927 unsigned size;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
928 unsigned avail; /* Offset of next open position. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
929 } fail_stack_type;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
930
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
931 #define FAIL_STACK_EMPTY() (fail_stack.avail == 0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
932 #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
933 #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
934 #define FAIL_STACK_TOP() (fail_stack.stack[fail_stack.avail])
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
935
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
936
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
937 /* Initialize `fail_stack'. Do `return -2' if the alloc fails. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
938
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
939 #ifdef MATCH_MAY_ALLOCATE
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
940 #define INIT_FAIL_STACK() \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
941 do { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
942 fail_stack.stack = (fail_stack_elt_t *) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
943 REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
944 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
945 if (fail_stack.stack == NULL) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
946 return -2; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
947 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
948 fail_stack.size = INIT_FAILURE_ALLOC; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
949 fail_stack.avail = 0; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
950 } while (0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
951 #else
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
952 #define INIT_FAIL_STACK() \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
953 do { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
954 fail_stack.avail = 0; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
955 } while (0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
956 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
957
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
958
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
959 /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
960
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
961 Return 1 if succeeds, and 0 if either ran out of memory
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
962 allocating space for it or it was already too large.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
963
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
964 REGEX_REALLOCATE requires `destination' be declared. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
965
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
966 #define DOUBLE_FAIL_STACK(fail_stack) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
967 ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
968 ? 0 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
969 : ((fail_stack).stack = (fail_stack_elt_t *) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
970 REGEX_REALLOCATE ((fail_stack).stack, \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
971 (fail_stack).size * sizeof (fail_stack_elt_t), \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
972 ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
973 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
974 (fail_stack).stack == NULL \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
975 ? 0 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
976 : ((fail_stack).size <<= 1, \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
977 1)))
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
978
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
979
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
980 /* Push PATTERN_OP on FAIL_STACK.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
981
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
982 Return 1 if was able to do so and 0 if ran out of memory allocating
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
983 space to do so. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
984 #define PUSH_PATTERN_OP(pattern_op, fail_stack) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
985 ((FAIL_STACK_FULL () \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
986 && !DOUBLE_FAIL_STACK (fail_stack)) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
987 ? 0 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
988 : ((fail_stack).stack[(fail_stack).avail++] = pattern_op, \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
989 1))
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
990
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
991 /* This pushes an item onto the failure stack. Must be a four-byte
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
992 value. Assumes the variable `fail_stack'. Probably should only
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
993 be called from within `PUSH_FAILURE_POINT'. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
994 #define PUSH_FAILURE_ITEM(item) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
995 fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
996
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
997 /* The complement operation. Assumes `fail_stack' is nonempty. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
998 #define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail]
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
999
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1000 /* Used to omit pushing failure point id's when we're not debugging. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1001 #ifdef DEBUG
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1002 #define DEBUG_PUSH PUSH_FAILURE_ITEM
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1003 #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM ()
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1004 #else
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1005 #define DEBUG_PUSH(item)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1006 #define DEBUG_POP(item_addr)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1007 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1008
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1009
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1010 /* Push the information about the state we will need
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1011 if we ever fail back to it.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1012
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1013 Requires variables fail_stack, regstart, regend, reg_info, and
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1014 num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1015 declared.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1016
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1017 Does `return FAILURE_CODE' if runs out of memory. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1018
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1019 #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1020 do { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1021 char *destination; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1022 /* Must be int, so when we don't save any registers, the arithmetic \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1023 of 0 + -1 isn't done as unsigned. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1024 int this_reg; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1025 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1026 DEBUG_STATEMENT (failure_id++); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1027 DEBUG_STATEMENT (nfailure_points_pushed++); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1028 DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1029 DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1030 DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1031 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1032 DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1033 DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1034 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1035 /* Ensure we have enough space allocated for what we will push. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1036 while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1037 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1038 if (!DOUBLE_FAIL_STACK (fail_stack)) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1039 return failure_code; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1040 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1041 DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1042 (fail_stack).size); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1043 DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1044 } \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1045 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1046 /* Push the info, starting with the registers. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1047 DEBUG_PRINT1 ("\n"); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1048 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1049 for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1050 this_reg++) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1051 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1052 DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1053 DEBUG_STATEMENT (num_regs_pushed++); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1054 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1055 DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1056 PUSH_FAILURE_ITEM (regstart[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1057 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1058 DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1059 PUSH_FAILURE_ITEM (regend[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1060 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1061 DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1062 DEBUG_PRINT2 (" match_null=%d", \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1063 REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1064 DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1065 DEBUG_PRINT2 (" matched_something=%d", \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1066 MATCHED_SOMETHING (reg_info[this_reg])); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1067 DEBUG_PRINT2 (" ever_matched=%d", \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1068 EVER_MATCHED_SOMETHING (reg_info[this_reg])); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1069 DEBUG_PRINT1 ("\n"); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1070 PUSH_FAILURE_ITEM (reg_info[this_reg].word); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1071 } \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1072 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1073 DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1074 PUSH_FAILURE_ITEM (lowest_active_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1075 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1076 DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1077 PUSH_FAILURE_ITEM (highest_active_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1078 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1079 DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1080 DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1081 PUSH_FAILURE_ITEM (pattern_place); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1082 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1083 DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1084 DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1085 size2); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1086 DEBUG_PRINT1 ("'\n"); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1087 PUSH_FAILURE_ITEM (string_place); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1088 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1089 DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1090 DEBUG_PUSH (failure_id); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1091 } while (0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1092
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1093 /* This is the number of items that are pushed and popped on the stack
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1094 for each register. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1095 #define NUM_REG_ITEMS 3
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1096
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1097 /* Individual items aside from the registers. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1098 #ifdef DEBUG
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1099 #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1100 #else
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1101 #define NUM_NONREG_ITEMS 4
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1102 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1103
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1104 /* We push at most this many items on the stack. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1105 #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1106
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1107 /* We actually push this many items. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1108 #define NUM_FAILURE_ITEMS \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1109 ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1110 + NUM_NONREG_ITEMS)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1111
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1112 /* How many items can still be added to the stack without overflowing it. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1113 #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1114
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1115
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1116 /* Pops what PUSH_FAIL_STACK pushes.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1117
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1118 We restore into the parameters, all of which should be lvalues:
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1119 STR -- the saved data position.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1120 PAT -- the saved pattern position.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1121 LOW_REG, HIGH_REG -- the highest and lowest active registers.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1122 REGSTART, REGEND -- arrays of string positions.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1123 REG_INFO -- array of information about each subexpression.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1124
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1125 Also assumes the variables `fail_stack' and (if debugging), `bufp',
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1126 `pend', `string1', `size1', `string2', and `size2'. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1127
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1128 #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1129 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1130 DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1131 int this_reg; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1132 const unsigned char *string_temp; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1133 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1134 assert (!FAIL_STACK_EMPTY ()); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1135 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1136 /* Remove failure points and point to how many regs pushed. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1137 DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1138 DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1139 DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1140 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1141 assert (fail_stack.avail >= NUM_NONREG_ITEMS); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1142 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1143 DEBUG_POP (&failure_id); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1144 DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1145 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1146 /* If the saved string location is NULL, it came from an \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1147 on_failure_keep_string_jump opcode, and we want to throw away the \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1148 saved NULL, thus retaining our current position in the string. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1149 string_temp = POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1150 if (string_temp != NULL) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1151 str = (const char *) string_temp; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1152 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1153 DEBUG_PRINT2 (" Popping string 0x%x: `", str); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1154 DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1155 DEBUG_PRINT1 ("'\n"); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1156 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1157 pat = (unsigned char *) POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1158 DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1159 DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1160 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1161 /* Restore register info. */ \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1162 high_reg = (unsigned) POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1163 DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1164 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1165 low_reg = (unsigned) POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1166 DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1167 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1168 for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1169 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1170 DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1171 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1172 reg_info[this_reg].word = POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1173 DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1174 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1175 regend[this_reg] = (const char *) POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1176 DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1177 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1178 regstart[this_reg] = (const char *) POP_FAILURE_ITEM (); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1179 DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1180 } \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1181 \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1182 DEBUG_STATEMENT (nfailure_points_popped++); \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1183 } /* POP_FAILURE_POINT */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1184
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1185
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1186
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1187 /* Structure for per-register (a.k.a. per-group) information.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1188 This must not be longer than one word, because we push this value
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1189 onto the failure stack. Other register information, such as the
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1190 starting and ending positions (which are addresses), and the list of
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1191 inner groups (which is a bits list) are maintained in separate
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1192 variables.
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1193
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1194 We are making a (strictly speaking) nonportable assumption here: that
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1195 the compiler will pack our bit fields into something that fits into
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1196 the type of `word', i.e., is something that fits into one item on the
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1197 failure stack. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1198 typedef union
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1199 {
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1200 fail_stack_elt_t word;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1201 struct
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1202 {
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1203 /* This field is one if this group can match the empty string,
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1204 zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1205 #define MATCH_NULL_UNSET_VALUE 3
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1206 unsigned match_null_string_p : 2;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1207 unsigned is_active : 1;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1208 unsigned matched_something : 1;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1209 unsigned ever_matched_something : 1;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1210 } bits;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1211 } register_info_type;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1212
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1213 #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1214 #define IS_ACTIVE(R) ((R).bits.is_active)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1215 #define MATCHED_SOMETHING(R) ((R).bits.matched_something)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1216 #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1217
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1218
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1219 /* Call this when have matched a real character; it sets `matched' flags
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1220 for the subexpressions which we are currently inside. Also records
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1221 that those subexprs have matched. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1222 #define SET_REGS_MATCHED() \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1223 do \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1224 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1225 unsigned r; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1226 for (r = lowest_active_reg; r <= highest_active_reg; r++) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1227 { \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1228 MATCHED_SOMETHING (reg_info[r]) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1229 = EVER_MATCHED_SOMETHING (reg_info[r]) \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1230 = 1; \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1231 } \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1232 } \
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1233 while (0)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1234
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1235
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1236 /* Registers are set to a sentinel when they haven't yet matched. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1237 #define REG_UNSET_VALUE ((char *) -1)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1238 #define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1239
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1240
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1241
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
1242 /* How do we implement a missing MATCH_MAY_ALLOCATE?
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1243 We make the fail stack a global thing, and then grow it to
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1244 re_max_failures when we compile. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
1245 #ifndef MATCH_MAY_ALLOCATE
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1246 static fail_stack_type fail_stack;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1247
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1248 static const char ** regstart, ** regend;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1249 static const char ** old_regstart, ** old_regend;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1250 static const char **best_regstart, **best_regend;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1251 static register_info_type *reg_info;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1252 static const char **reg_dummy;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1253 static register_info_type *reg_info_dummy;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1254 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1255
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
1256
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1257 /* Subroutine declarations and macros for regex_compile. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1258
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1259 static void store_op1 (), store_op2 ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1260 static void insert_op1 (), insert_op2 ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1261 static boolean at_begline_loc_p (), at_endline_loc_p ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1262 static boolean group_in_compile_stack ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1263 static reg_errcode_t compile_range ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1264
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1265 /* Fetch the next character in the uncompiled pattern---translating it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1266 if necessary. Also cast from a signed character in the constant
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1267 string passed to us by the user to an unsigned char that we can use
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1268 as an array index (in, e.g., `translate'). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1269 #define PATFETCH(c) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1270 do {if (p == pend) return REG_EEND; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1271 c = (unsigned char) *p++; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1272 if (translate) c = translate[c]; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1273 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1274
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1275 /* Fetch the next character in the uncompiled pattern, with no
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1276 translation. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1277 #define PATFETCH_RAW(c) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1278 do {if (p == pend) return REG_EEND; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1279 c = (unsigned char) *p++; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1280 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1281
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1282 /* Go backwards one character in the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1283 #define PATUNFETCH p--
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1284
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1285
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1286 /* If `translate' is non-null, return translate[D], else just D. We
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1287 cast the subscript to translate because some data is declared as
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1288 `char *', to avoid warnings when a string constant is passed. But
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1289 when we use a character as a subscript we must make it unsigned. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1290 #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1291
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1292
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1293 /* Macros for outputting the compiled pattern into `buffer'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1294
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1295 /* If the buffer isn't allocated when it comes in, use this. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1296 #define INIT_BUF_SIZE 32
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1297
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1298 /* Make sure we have at least N more bytes of space in buffer. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1299 #define GET_BUFFER_SPACE(n) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1300 while (b - bufp->buffer + (n) > bufp->allocated) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1301 EXTEND_BUFFER ()
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1302
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1303 /* Make sure we have one more byte of buffer space and then add C to it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1304 #define BUF_PUSH(c) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1305 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1306 GET_BUFFER_SPACE (1); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1307 *b++ = (unsigned char) (c); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1308 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1309
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1310
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1311 /* Ensure we have two more bytes of buffer space and then append C1 and C2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1312 #define BUF_PUSH_2(c1, c2) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1313 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1314 GET_BUFFER_SPACE (2); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1315 *b++ = (unsigned char) (c1); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1316 *b++ = (unsigned char) (c2); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1317 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1318
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1319
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1320 /* As with BUF_PUSH_2, except for three bytes. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1321 #define BUF_PUSH_3(c1, c2, c3) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1322 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1323 GET_BUFFER_SPACE (3); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1324 *b++ = (unsigned char) (c1); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1325 *b++ = (unsigned char) (c2); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1326 *b++ = (unsigned char) (c3); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1327 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1328
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1329
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1330 /* Store a jump with opcode OP at LOC to location TO. We store a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1331 relative address offset by the three bytes the jump itself occupies. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1332 #define STORE_JUMP(op, loc, to) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1333 store_op1 (op, loc, (to) - (loc) - 3)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1334
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1335 /* Likewise, for a two-argument jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1336 #define STORE_JUMP2(op, loc, to, arg) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1337 store_op2 (op, loc, (to) - (loc) - 3, arg)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1338
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1339 /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1340 #define INSERT_JUMP(op, loc, to) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1341 insert_op1 (op, loc, (to) - (loc) - 3, b)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1342
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1343 /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1344 #define INSERT_JUMP2(op, loc, to, arg) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1345 insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1346
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1347
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1348 /* This is not an arbitrary limit: the arguments which represent offsets
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1349 into the pattern are two bytes long. So if 2^16 bytes turns out to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1350 be too small, many things would have to change. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1351 #define MAX_BUF_SIZE (1L << 16)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1352
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1353
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1354 /* Extend the buffer by twice its current size via realloc and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1355 reset the pointers that pointed into the old block to point to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1356 correct places in the new one. If extending the buffer results in it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1357 being larger than MAX_BUF_SIZE, then flag memory exhausted. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1358 #define EXTEND_BUFFER() \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1359 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1360 unsigned char *old_buffer = bufp->buffer; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1361 if (bufp->allocated == MAX_BUF_SIZE) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1362 return REG_ESIZE; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1363 bufp->allocated <<= 1; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1364 if (bufp->allocated > MAX_BUF_SIZE) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1365 bufp->allocated = MAX_BUF_SIZE; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1366 bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1367 if (bufp->buffer == NULL) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1368 return REG_ESPACE; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1369 /* If the buffer moved, move all the pointers into it. */ \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1370 if (old_buffer != bufp->buffer) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1371 { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1372 b = (b - old_buffer) + bufp->buffer; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1373 begalt = (begalt - old_buffer) + bufp->buffer; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1374 if (fixup_alt_jump) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1375 fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1376 if (laststart) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1377 laststart = (laststart - old_buffer) + bufp->buffer; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1378 if (pending_exact) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1379 pending_exact = (pending_exact - old_buffer) + bufp->buffer; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1380 } \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1381 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1382
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1383
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1384 /* Since we have one byte reserved for the register number argument to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1385 {start,stop}_memory, the maximum number of groups we can report
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1386 things about is what fits in that byte. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1387 #define MAX_REGNUM 255
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1388
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1389 /* But patterns can have more than `MAX_REGNUM' registers. We just
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1390 ignore the excess. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1391 typedef unsigned regnum_t;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1392
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1393
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1394 /* Macros for the compile stack. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1395
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1396 /* Since offsets can go either forwards or backwards, this type needs to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1397 be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1398 typedef int pattern_offset_t;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1399
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1400 typedef struct
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1401 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1402 pattern_offset_t begalt_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1403 pattern_offset_t fixup_alt_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1404 pattern_offset_t inner_group_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1405 pattern_offset_t laststart_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1406 regnum_t regnum;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1407 } compile_stack_elt_t;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1408
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1409
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1410 typedef struct
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1411 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1412 compile_stack_elt_t *stack;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1413 unsigned size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1414 unsigned avail; /* Offset of next open position. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1415 } compile_stack_type;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1416
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1417
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1418 #define INIT_COMPILE_STACK_SIZE 32
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1419
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1420 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1421 #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1422
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1423 /* The next available element. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1424 #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1425
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1426
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1427 /* Set the bit for character C in a list. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1428 #define SET_LIST_BIT(c) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1429 (b[((unsigned char) (c)) / BYTEWIDTH] \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1430 |= 1 << (((unsigned char) c) % BYTEWIDTH))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1431
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1432
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1433 /* Get the next unsigned number in the uncompiled pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1434 #define GET_UNSIGNED_NUMBER(num) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1435 { if (p != pend) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1436 { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1437 PATFETCH (c); \
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1438 while (ISDIGIT (c)) \
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1439 { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1440 if (num < 0) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1441 num = 0; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1442 num = num * 10 + c - '0'; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1443 if (p == pend) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1444 break; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1445 PATFETCH (c); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1446 } \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1447 } \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1448 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1449
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1450 #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1451
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1452 #define IS_CHAR_CLASS(string) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1453 (STREQ (string, "alpha") || STREQ (string, "upper") \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1454 || STREQ (string, "lower") || STREQ (string, "digit") \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1455 || STREQ (string, "alnum") || STREQ (string, "xdigit") \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1456 || STREQ (string, "space") || STREQ (string, "print") \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1457 || STREQ (string, "punct") || STREQ (string, "graph") \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1458 || STREQ (string, "cntrl") || STREQ (string, "blank"))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1459
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1460 /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1461 Returns one of error codes defined in `regex.h', or zero for success.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1462
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1463 Assumes the `allocated' (and perhaps `buffer') and `translate'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1464 fields are set in BUFP on entry.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1465
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1466 If it succeeds, results are put in BUFP (if it returns an error, the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1467 contents of BUFP are undefined):
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1468 `buffer' is the compiled pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1469 `syntax' is set to SYNTAX;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1470 `used' is set to the length of the compiled pattern;
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
1471 `fastmap_accurate' is zero;
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
1472 `re_nsub' is the number of subexpressions in PATTERN;
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
1473 `not_bol' and `not_eol' are zero;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1474
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1475 The `fastmap' and `newline_anchor' fields are neither
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1476 examined nor set. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1477
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1478 static reg_errcode_t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1479 regex_compile (pattern, size, syntax, bufp)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1480 const char *pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1481 int size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1482 reg_syntax_t syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1483 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1484 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1485 /* We fetch characters from PATTERN here. Even though PATTERN is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1486 `char *' (i.e., signed), we declare these variables as unsigned, so
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1487 they can be reliably used as array indices. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1488 register unsigned char c, c1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1489
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1490 /* A random tempory spot in PATTERN. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1491 const char *p1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1492
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1493 /* Points to the end of the buffer, where we should append. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1494 register unsigned char *b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1495
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1496 /* Keeps track of unclosed groups. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1497 compile_stack_type compile_stack;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1498
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1499 /* Points to the current (ending) position in the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1500 const char *p = pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1501 const char *pend = pattern + size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1502
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1503 /* How to translate the characters in the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1504 char *translate = bufp->translate;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1505
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1506 /* Address of the count-byte of the most recently inserted `exactn'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1507 command. This makes it possible to tell if a new exact-match
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1508 character can be added to that command or if the character requires
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1509 a new `exactn' command. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1510 unsigned char *pending_exact = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1511
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1512 /* Address of start of the most recently finished expression.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1513 This tells, e.g., postfix * where to find the start of its
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1514 operand. Reset at the beginning of groups and alternatives. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1515 unsigned char *laststart = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1516
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1517 /* Address of beginning of regexp, or inside of last group. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1518 unsigned char *begalt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1519
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1520 /* Place in the uncompiled pattern (i.e., the {) to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1521 which to go back if the interval is invalid. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1522 const char *beg_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1523
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1524 /* Address of the place where a forward jump should go to the end of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1525 the containing expression. Each alternative of an `or' -- except the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1526 last -- ends with a forward jump of this sort. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1527 unsigned char *fixup_alt_jump = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1528
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1529 /* Counts open-groups as they are encountered. Remembered for the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1530 matching close-group on the compile stack, so the same register
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1531 number is put in the stop_memory as the start_memory. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1532 regnum_t regnum = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1533
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1534 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1535 DEBUG_PRINT1 ("\nCompiling pattern: ");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1536 if (debug)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1537 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1538 unsigned debug_count;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1539
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1540 for (debug_count = 0; debug_count < size; debug_count++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1541 printchar (pattern[debug_count]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1542 putchar ('\n');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1543 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1544 #endif /* DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1545
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1546 /* Initialize the compile stack. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1547 compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1548 if (compile_stack.stack == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1549 return REG_ESPACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1550
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1551 compile_stack.size = INIT_COMPILE_STACK_SIZE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1552 compile_stack.avail = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1553
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1554 /* Initialize the pattern buffer. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1555 bufp->syntax = syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1556 bufp->fastmap_accurate = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1557 bufp->not_bol = bufp->not_eol = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1558
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1559 /* Set `used' to zero, so that if we return an error, the pattern
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1560 printer (for debugging) will think there's no pattern. We reset it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1561 at the end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1562 bufp->used = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1563
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1564 /* Always count groups, whether or not bufp->no_sub is set. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1565 bufp->re_nsub = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1566
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1567 #if !defined (emacs) && !defined (SYNTAX_TABLE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1568 /* Initialize the syntax table. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1569 init_syntax_once ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1570 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1571
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1572 if (bufp->allocated == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1573 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1574 if (bufp->buffer)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1575 { /* If zero allocated, but buffer is non-null, try to realloc
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1576 enough space. This loses if buffer's address is bogus, but
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1577 that is the user's responsibility. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1578 RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1579 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1580 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1581 { /* Caller did not allocate a buffer. Do it for them. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1582 bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1583 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1584 if (!bufp->buffer) return REG_ESPACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1585
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1586 bufp->allocated = INIT_BUF_SIZE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1587 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1588
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1589 begalt = b = bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1590
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1591 /* Loop through the uncompiled pattern until we're at the end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1592 while (p != pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1593 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1594 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1595
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1596 switch (c)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1597 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1598 case '^':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1599 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1600 if ( /* If at start of pattern, it's an operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1601 p == pattern + 1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1602 /* If context independent, it's an operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1603 || syntax & RE_CONTEXT_INDEP_ANCHORS
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1604 /* Otherwise, depends on what's come before. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1605 || at_begline_loc_p (pattern, p, syntax))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1606 BUF_PUSH (begline);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1607 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1608 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1609 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1610 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1611
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1612
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1613 case '$':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1614 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1615 if ( /* If at end of pattern, it's an operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1616 p == pend
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1617 /* If context independent, it's an operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1618 || syntax & RE_CONTEXT_INDEP_ANCHORS
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1619 /* Otherwise, depends on what's next. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1620 || at_endline_loc_p (p, pend, syntax))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1621 BUF_PUSH (endline);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1622 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1623 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1624 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1625 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1626
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1627
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1628 case '+':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1629 case '?':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1630 if ((syntax & RE_BK_PLUS_QM)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1631 || (syntax & RE_LIMITED_OPS))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1632 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1633 handle_plus:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1634 case '*':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1635 /* If there is no previous pattern... */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1636 if (!laststart)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1637 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1638 if (syntax & RE_CONTEXT_INVALID_OPS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1639 return REG_BADRPT;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1640 else if (!(syntax & RE_CONTEXT_INDEP_OPS))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1641 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1642 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1643
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1644 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1645 /* Are we optimizing this jump? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1646 boolean keep_string_p = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1647
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1648 /* 1 means zero (many) matches is allowed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1649 char zero_times_ok = 0, many_times_ok = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1650
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1651 /* If there is a sequence of repetition chars, collapse it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1652 down to just one (the right one). We can't combine
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1653 interval operators with these because of, e.g., `a{2}*',
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1654 which should only match an even number of `a's. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1655
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1656 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1657 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1658 zero_times_ok |= c != '+';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1659 many_times_ok |= c != '?';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1660
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1661 if (p == pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1662 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1663
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1664 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1665
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1666 if (c == '*'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1667 || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1668 ;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1669
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1670 else if (syntax & RE_BK_PLUS_QM && c == '\\')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1671 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1672 if (p == pend) return REG_EESCAPE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1673
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1674 PATFETCH (c1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1675 if (!(c1 == '+' || c1 == '?'))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1676 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1677 PATUNFETCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1678 PATUNFETCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1679 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1680 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1681
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1682 c = c1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1683 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1684 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1685 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1686 PATUNFETCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1687 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1688 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1689
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1690 /* If we get here, we found another repeat character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1691 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1692
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1693 /* Star, etc. applied to an empty pattern is equivalent
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1694 to an empty pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1695 if (!laststart)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1696 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1697
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1698 /* Now we know whether or not zero matches is allowed
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1699 and also whether or not two or more matches is allowed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1700 if (many_times_ok)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1701 { /* More than one repetition is allowed, so put in at the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1702 end a backward relative jump from `b' to before the next
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1703 jump we're going to put in below (which jumps from
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1704 laststart to after this jump).
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1705
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1706 But if we are at the `*' in the exact sequence `.*\n',
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1707 insert an unconditional jump backwards to the .,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1708 instead of the beginning of the loop. This way we only
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1709 push a failure point once, instead of every time
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1710 through the loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1711 assert (p - 1 > pattern);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1712
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1713 /* Allocate the space for the jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1714 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1715
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1716 /* We know we are not at the first character of the pattern,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1717 because laststart was nonzero. And we've already
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1718 incremented `p', by the way, to be the character after
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1719 the `*'. Do we have to do something analogous here
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1720 for null bytes, because of RE_DOT_NOT_NULL? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1721 if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
2453
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
1722 && zero_times_ok
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1723 && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1724 && !(syntax & RE_DOT_NEWLINE))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1725 { /* We have .*\n. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1726 STORE_JUMP (jump, b, laststart);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1727 keep_string_p = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1728 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1729 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1730 /* Anything else. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1731 STORE_JUMP (maybe_pop_jump, b, laststart - 3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1732
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1733 /* We've added more stuff to the buffer. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1734 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1735 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1736
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1737 /* On failure, jump from laststart to b + 3, which will be the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1738 end of the buffer after this jump is inserted. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1739 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1740 INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1741 : on_failure_jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1742 laststart, b + 3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1743 pending_exact = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1744 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1745
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1746 if (!zero_times_ok)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1747 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1748 /* At least one repetition is required, so insert a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1749 `dummy_failure_jump' before the initial
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1750 `on_failure_jump' instruction of the loop. This
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1751 effects a skip over that instruction the first time
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1752 we hit that loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1753 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1754 INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1755 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1756 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1757 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1758 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1759
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1760
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1761 case '.':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1762 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1763 BUF_PUSH (anychar);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1764 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1765
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1766
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1767 case '[':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1768 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1769 boolean had_char_class = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1770
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1771 if (p == pend) return REG_EBRACK;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1772
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1773 /* Ensure that we have enough space to push a charset: the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1774 opcode, the length count, and the bitset; 34 bytes in all. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1775 GET_BUFFER_SPACE (34);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1776
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1777 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1778
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1779 /* We test `*p == '^' twice, instead of using an if
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1780 statement, so we only need one BUF_PUSH. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1781 BUF_PUSH (*p == '^' ? charset_not : charset);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1782 if (*p == '^')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1783 p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1784
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1785 /* Remember the first position in the bracket expression. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1786 p1 = p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1787
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1788 /* Push the number of bytes in the bitmap. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1789 BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1790
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1791 /* Clear the whole map. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1792 bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1793
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1794 /* charset_not matches newline according to a syntax bit. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1795 if ((re_opcode_t) b[-2] == charset_not
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1796 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1797 SET_LIST_BIT ('\n');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1798
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1799 /* Read in characters and ranges, setting map bits. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1800 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1801 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1802 if (p == pend) return REG_EBRACK;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1803
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1804 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1805
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1806 /* \ might escape characters inside [...] and [^...]. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1807 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1808 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1809 if (p == pend) return REG_EESCAPE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1810
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1811 PATFETCH (c1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1812 SET_LIST_BIT (c1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1813 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1814 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1815
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1816 /* Could be the end of the bracket expression. If it's
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1817 not (i.e., when the bracket expression is `[]' so
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1818 far), the ']' character bit gets set way below. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1819 if (c == ']' && p != p1 + 1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1820 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1821
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1822 /* Look ahead to see if it's a range when the last thing
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1823 was a character class. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1824 if (had_char_class && c == '-' && *p != ']')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1825 return REG_ERANGE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1826
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1827 /* Look ahead to see if it's a range when the last thing
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1828 was a character: if this is a hyphen not at the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1829 beginning or the end of a list, then it's the range
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1830 operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1831 if (c == '-'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1832 && !(p - 2 >= pattern && p[-2] == '[')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1833 && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1834 && *p != ']')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1835 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1836 reg_errcode_t ret
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1837 = compile_range (&p, pend, translate, syntax, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1838 if (ret != REG_NOERROR) return ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1839 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1840
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1841 else if (p[0] == '-' && p[1] != ']')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1842 { /* This handles ranges made up of characters only. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1843 reg_errcode_t ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1844
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1845 /* Move past the `-'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1846 PATFETCH (c1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1847
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1848 ret = compile_range (&p, pend, translate, syntax, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1849 if (ret != REG_NOERROR) return ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1850 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1851
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1852 /* See if we're at the beginning of a possible character
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1853 class. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1854
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1855 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1856 { /* Leave room for the null. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1857 char str[CHAR_CLASS_MAX_LENGTH + 1];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1858
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1859 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1860 c1 = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1861
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1862 /* If pattern is `[[:'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1863 if (p == pend) return REG_EBRACK;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1864
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1865 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1866 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1867 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1868 if (c == ':' || c == ']' || p == pend
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1869 || c1 == CHAR_CLASS_MAX_LENGTH)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1870 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1871 str[c1++] = c;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1872 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1873 str[c1] = '\0';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1874
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1875 /* If isn't a word bracketed by `[:' and:`]':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1876 undo the ending character, the letters, and leave
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1877 the leading `:' and `[' (but set bits for them). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1878 if (c == ':' && *p == ']')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1879 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1880 int ch;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1881 boolean is_alnum = STREQ (str, "alnum");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1882 boolean is_alpha = STREQ (str, "alpha");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1883 boolean is_blank = STREQ (str, "blank");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1884 boolean is_cntrl = STREQ (str, "cntrl");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1885 boolean is_digit = STREQ (str, "digit");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1886 boolean is_graph = STREQ (str, "graph");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1887 boolean is_lower = STREQ (str, "lower");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1888 boolean is_print = STREQ (str, "print");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1889 boolean is_punct = STREQ (str, "punct");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1890 boolean is_space = STREQ (str, "space");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1891 boolean is_upper = STREQ (str, "upper");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1892 boolean is_xdigit = STREQ (str, "xdigit");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1893
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1894 if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1895
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1896 /* Throw away the ] at the end of the character
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1897 class. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1898 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1899
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1900 if (p == pend) return REG_EBRACK;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1901
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1902 for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1903 {
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1904 if ( (is_alnum && ISALNUM (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1905 || (is_alpha && ISALPHA (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1906 || (is_blank && ISBLANK (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1907 || (is_cntrl && ISCNTRL (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1908 || (is_digit && ISDIGIT (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1909 || (is_graph && ISGRAPH (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1910 || (is_lower && ISLOWER (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1911 || (is_print && ISPRINT (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1912 || (is_punct && ISPUNCT (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1913 || (is_space && ISSPACE (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1914 || (is_upper && ISUPPER (ch))
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
1915 || (is_xdigit && ISXDIGIT (ch)))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1916 SET_LIST_BIT (ch);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1917 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1918 had_char_class = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1919 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1920 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1921 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1922 c1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1923 while (c1--)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1924 PATUNFETCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1925 SET_LIST_BIT ('[');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1926 SET_LIST_BIT (':');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1927 had_char_class = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1928 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1929 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1930 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1931 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1932 had_char_class = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1933 SET_LIST_BIT (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1934 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1935 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1936
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1937 /* Discard any (non)matching list bytes that are all 0 at the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1938 end of the map. Decrease the map-length byte too. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1939 while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1940 b[-1]--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1941 b += b[-1];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1942 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1943 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1944
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1945
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1946 case '(':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1947 if (syntax & RE_NO_BK_PARENS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1948 goto handle_open;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1949 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1950 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1951
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1952
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1953 case ')':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1954 if (syntax & RE_NO_BK_PARENS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1955 goto handle_close;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1956 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1957 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1958
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1959
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1960 case '\n':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1961 if (syntax & RE_NEWLINE_ALT)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1962 goto handle_alt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1963 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1964 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1965
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1966
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1967 case '|':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1968 if (syntax & RE_NO_BK_VBAR)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1969 goto handle_alt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1970 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1971 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1972
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1973
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1974 case '{':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1975 if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1976 goto handle_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1977 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1978 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1979
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1980
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1981 case '\\':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1982 if (p == pend) return REG_EESCAPE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1983
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1984 /* Do not translate the character after the \, so that we can
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1985 distinguish, e.g., \B from \b, even if we normally would
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1986 translate, e.g., B to b. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1987 PATFETCH_RAW (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1988
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1989 switch (c)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1990 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1991 case '(':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1992 if (syntax & RE_NO_BK_PARENS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1993 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1994
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1995 handle_open:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1996 bufp->re_nsub++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1997 regnum++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1998
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
1999 if (COMPILE_STACK_FULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2000 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2001 RETALLOC (compile_stack.stack, compile_stack.size << 1,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2002 compile_stack_elt_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2003 if (compile_stack.stack == NULL) return REG_ESPACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2004
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2005 compile_stack.size <<= 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2006 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2007
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2008 /* These are the values to restore when we hit end of this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2009 group. They are all relative offsets, so that if the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2010 whole pattern moves because of realloc, they will still
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2011 be valid. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2012 COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2013 COMPILE_STACK_TOP.fixup_alt_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2014 = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2015 COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2016 COMPILE_STACK_TOP.regnum = regnum;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2017
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2018 /* We will eventually replace the 0 with the number of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2019 groups inner to this one. But do not push a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2020 start_memory for groups beyond the last one we can
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2021 represent in the compiled pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2022 if (regnum <= MAX_REGNUM)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2023 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2024 COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2025 BUF_PUSH_3 (start_memory, regnum, 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2026 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2027
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2028 compile_stack.avail++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2029
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2030 fixup_alt_jump = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2031 laststart = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2032 begalt = b;
2453
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2033 /* If we've reached MAX_REGNUM groups, then this open
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2034 won't actually generate any code, so we'll have to
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2035 clear pending_exact explicitly. */
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2036 pending_exact = 0;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2037 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2038
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2039
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2040 case ')':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2041 if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2042
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2043 if (COMPILE_STACK_EMPTY)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2044 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2045 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2046 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2047 return REG_ERPAREN;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2048
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2049 handle_close:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2050 if (fixup_alt_jump)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2051 { /* Push a dummy failure point at the end of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2052 alternative for a possible future
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2053 `pop_failure_jump' to pop. See comments at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2054 `push_dummy_failure' in `re_match_2'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2055 BUF_PUSH (push_dummy_failure);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2056
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2057 /* We allocated space for this jump when we assigned
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2058 to `fixup_alt_jump', in the `handle_alt' case below. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2059 STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2060 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2061
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2062 /* See similar code for backslashed left paren above. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2063 if (COMPILE_STACK_EMPTY)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2064 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2065 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2066 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2067 return REG_ERPAREN;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2068
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2069 /* Since we just checked for an empty stack above, this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2070 ``can't happen''. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2071 assert (compile_stack.avail != 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2072 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2073 /* We don't just want to restore into `regnum', because
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2074 later groups should continue to be numbered higher,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2075 as in `(ab)c(de)' -- the second group is #2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2076 regnum_t this_group_regnum;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2077
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2078 compile_stack.avail--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2079 begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2080 fixup_alt_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2081 = COMPILE_STACK_TOP.fixup_alt_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2082 ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2083 : 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2084 laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2085 this_group_regnum = COMPILE_STACK_TOP.regnum;
2453
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2086 /* If we've reached MAX_REGNUM groups, then this open
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2087 won't actually generate any code, so we'll have to
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2088 clear pending_exact explicitly. */
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
2089 pending_exact = 0;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2090
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2091 /* We're at the end of the group, so now we know how many
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2092 groups were inside this one. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2093 if (this_group_regnum <= MAX_REGNUM)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2094 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2095 unsigned char *inner_group_loc
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2096 = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2097
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2098 *inner_group_loc = regnum - this_group_regnum;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2099 BUF_PUSH_3 (stop_memory, this_group_regnum,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2100 regnum - this_group_regnum);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2101 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2102 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2103 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2104
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2105
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2106 case '|': /* `\|'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2107 if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2108 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2109 handle_alt:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2110 if (syntax & RE_LIMITED_OPS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2111 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2112
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2113 /* Insert before the previous alternative a jump which
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2114 jumps to this alternative if the former fails. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2115 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2116 INSERT_JUMP (on_failure_jump, begalt, b + 6);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2117 pending_exact = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2118 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2119
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2120 /* The alternative before this one has a jump after it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2121 which gets executed if it gets matched. Adjust that
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2122 jump so it will jump to this alternative's analogous
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2123 jump (put in below, which in turn will jump to the next
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2124 (if any) alternative's such jump, etc.). The last such
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2125 jump jumps to the correct final destination. A picture:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2126 _____ _____
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2127 | | | |
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2128 | v | v
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2129 a | b | c
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2130
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
2131 If we are at `b', then fixup_alt_jump right now points to a
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
2132 three-byte space after `a'. We'll put in the jump, set
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
2133 fixup_alt_jump to right after `b', and leave behind three
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
2134 bytes which we'll fill in when we get to after `c'. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2135
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2136 if (fixup_alt_jump)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2137 STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2138
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2139 /* Mark and leave space for a jump after this alternative,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2140 to be filled in later either by next alternative or
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2141 when know we're at the end of a series of alternatives. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2142 fixup_alt_jump = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2143 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2144 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2145
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2146 laststart = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2147 begalt = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2148 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2149
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2150
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2151 case '{':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2152 /* If \{ is a literal. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2153 if (!(syntax & RE_INTERVALS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2154 /* If we're at `\{' and it's not the open-interval
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2155 operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2156 || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2157 || (p - 2 == pattern && p == pend))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2158 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2159
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2160 handle_interval:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2161 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2162 /* If got here, then the syntax allows intervals. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2163
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2164 /* At least (most) this many matches must be made. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2165 int lower_bound = -1, upper_bound = -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2166
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2167 beg_interval = p - 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2168
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2169 if (p == pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2170 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2171 if (syntax & RE_NO_BK_BRACES)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2172 goto unfetch_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2173 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2174 return REG_EBRACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2175 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2176
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2177 GET_UNSIGNED_NUMBER (lower_bound);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2178
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2179 if (c == ',')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2180 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2181 GET_UNSIGNED_NUMBER (upper_bound);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2182 if (upper_bound < 0) upper_bound = RE_DUP_MAX;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2183 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2184 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2185 /* Interval such as `{1}' => match exactly once. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2186 upper_bound = lower_bound;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2187
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2188 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2189 || lower_bound > upper_bound)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2190 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2191 if (syntax & RE_NO_BK_BRACES)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2192 goto unfetch_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2193 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2194 return REG_BADBR;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2195 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2196
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2197 if (!(syntax & RE_NO_BK_BRACES))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2198 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2199 if (c != '\\') return REG_EBRACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2200
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2201 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2202 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2203
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2204 if (c != '}')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2205 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2206 if (syntax & RE_NO_BK_BRACES)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2207 goto unfetch_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2208 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2209 return REG_BADBR;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2210 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2211
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2212 /* We just parsed a valid interval. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2213
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2214 /* If it's invalid to have no preceding re. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2215 if (!laststart)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2216 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2217 if (syntax & RE_CONTEXT_INVALID_OPS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2218 return REG_BADRPT;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2219 else if (syntax & RE_CONTEXT_INDEP_OPS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2220 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2221 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2222 goto unfetch_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2223 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2224
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2225 /* If the upper bound is zero, don't want to succeed at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2226 all; jump from `laststart' to `b + 3', which will be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2227 the end of the buffer after we insert the jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2228 if (upper_bound == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2229 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2230 GET_BUFFER_SPACE (3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2231 INSERT_JUMP (jump, laststart, b + 3);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2232 b += 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2233 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2234
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2235 /* Otherwise, we have a nontrivial interval. When
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2236 we're all done, the pattern will look like:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2237 set_number_at <jump count> <upper bound>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2238 set_number_at <succeed_n count> <lower bound>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2239 succeed_n <after jump addr> <succed_n count>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2240 <body of loop>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2241 jump_n <succeed_n addr> <jump count>
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2242 (The upper bound and `jump_n' are omitted if
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2243 `upper_bound' is 1, though.) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2244 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2245 { /* If the upper bound is > 1, we need to insert
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2246 more at the end of the loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2247 unsigned nbytes = 10 + (upper_bound > 1) * 10;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2248
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2249 GET_BUFFER_SPACE (nbytes);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2250
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2251 /* Initialize lower bound of the `succeed_n', even
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2252 though it will be set during matching by its
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2253 attendant `set_number_at' (inserted next),
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2254 because `re_compile_fastmap' needs to know.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2255 Jump to the `jump_n' we might insert below. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2256 INSERT_JUMP2 (succeed_n, laststart,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2257 b + 5 + (upper_bound > 1) * 5,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2258 lower_bound);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2259 b += 5;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2260
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2261 /* Code to initialize the lower bound. Insert
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2262 before the `succeed_n'. The `5' is the last two
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2263 bytes of this `set_number_at', plus 3 bytes of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2264 the following `succeed_n'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2265 insert_op2 (set_number_at, laststart, 5, lower_bound, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2266 b += 5;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2267
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2268 if (upper_bound > 1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2269 { /* More than one repetition is allowed, so
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2270 append a backward jump to the `succeed_n'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2271 that starts this interval.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2272
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2273 When we've reached this during matching,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2274 we'll have matched the interval once, so
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2275 jump back only `upper_bound - 1' times. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2276 STORE_JUMP2 (jump_n, b, laststart + 5,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2277 upper_bound - 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2278 b += 5;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2279
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2280 /* The location we want to set is the second
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2281 parameter of the `jump_n'; that is `b-2' as
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2282 an absolute address. `laststart' will be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2283 the `set_number_at' we're about to insert;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2284 `laststart+3' the number to set, the source
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2285 for the relative address. But we are
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2286 inserting into the middle of the pattern --
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2287 so everything is getting moved up by 5.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2288 Conclusion: (b - 2) - (laststart + 3) + 5,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2289 i.e., b - laststart.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2290
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2291 We insert this at the beginning of the loop
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2292 so that if we fail during matching, we'll
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2293 reinitialize the bounds. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2294 insert_op2 (set_number_at, laststart, b - laststart,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2295 upper_bound - 1, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2296 b += 5;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2297 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2298 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2299 pending_exact = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2300 beg_interval = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2301 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2302 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2303
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2304 unfetch_interval:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2305 /* If an invalid interval, match the characters as literals. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2306 assert (beg_interval);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2307 p = beg_interval;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2308 beg_interval = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2309
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2310 /* normal_char and normal_backslash need `c'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2311 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2312
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2313 if (!(syntax & RE_NO_BK_BRACES))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2314 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2315 if (p > pattern && p[-1] == '\\')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2316 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2317 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2318 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2319
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2320 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2321 /* There is no way to specify the before_dot and after_dot
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2322 operators. rms says this is ok. --karl */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2323 case '=':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2324 BUF_PUSH (at_dot);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2325 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2326
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2327 case 's':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2328 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2329 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2330 BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2331 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2332
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2333 case 'S':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2334 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2335 PATFETCH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2336 BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2337 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2338 #endif /* emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2339
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2340
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2341 case 'w':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2342 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2343 BUF_PUSH (wordchar);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2344 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2345
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2346
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2347 case 'W':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2348 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2349 BUF_PUSH (notwordchar);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2350 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2351
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2352
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2353 case '<':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2354 BUF_PUSH (wordbeg);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2355 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2356
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2357 case '>':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2358 BUF_PUSH (wordend);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2359 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2360
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2361 case 'b':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2362 BUF_PUSH (wordbound);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2363 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2364
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2365 case 'B':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2366 BUF_PUSH (notwordbound);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2367 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2368
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2369 case '`':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2370 BUF_PUSH (begbuf);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2371 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2372
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2373 case '\'':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2374 BUF_PUSH (endbuf);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2375 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2376
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2377 case '1': case '2': case '3': case '4': case '5':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2378 case '6': case '7': case '8': case '9':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2379 if (syntax & RE_NO_BK_REFS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2380 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2381
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2382 c1 = c - '0';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2383
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2384 if (c1 > regnum)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2385 return REG_ESUBREG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2386
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2387 /* Can't back reference to a subexpression if inside of it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2388 if (group_in_compile_stack (compile_stack, c1))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2389 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2390
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2391 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2392 BUF_PUSH_2 (duplicate, c1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2393 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2394
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2395
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2396 case '+':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2397 case '?':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2398 if (syntax & RE_BK_PLUS_QM)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2399 goto handle_plus;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2400 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2401 goto normal_backslash;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2402
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2403 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2404 normal_backslash:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2405 /* You might think it would be useful for \ to mean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2406 not to translate; but if we don't translate it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2407 it will never match anything. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2408 c = TRANSLATE (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2409 goto normal_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2410 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2411 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2412
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2413
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2414 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2415 /* Expects the character in `c'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2416 normal_char:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2417 /* If no exactn currently being built. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2418 if (!pending_exact
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2419
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2420 /* If last exactn not at current position. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2421 || pending_exact + *pending_exact + 1 != b
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2422
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2423 /* We have only one byte following the exactn for the count. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2424 || *pending_exact == (1 << BYTEWIDTH) - 1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2425
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2426 /* If followed by a repetition operator. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2427 || *p == '*' || *p == '^'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2428 || ((syntax & RE_BK_PLUS_QM)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2429 ? *p == '\\' && (p[1] == '+' || p[1] == '?')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2430 : (*p == '+' || *p == '?'))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2431 || ((syntax & RE_INTERVALS)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2432 && ((syntax & RE_NO_BK_BRACES)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2433 ? *p == '{'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2434 : (p[0] == '\\' && p[1] == '{'))))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2435 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2436 /* Start building a new exactn. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2437
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2438 laststart = b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2439
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2440 BUF_PUSH_2 (exactn, 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2441 pending_exact = b - 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2442 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2443
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2444 BUF_PUSH (c);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2445 (*pending_exact)++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2446 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2447 } /* switch (c) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2448 } /* while p != pend */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2449
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2450
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2451 /* Through the pattern now. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2452
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2453 if (fixup_alt_jump)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2454 STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2455
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2456 if (!COMPILE_STACK_EMPTY)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2457 return REG_EPAREN;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2458
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2459 free (compile_stack.stack);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2460
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2461 /* We have succeeded; set the length of the buffer. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2462 bufp->used = b - bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2463
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2464 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2465 if (debug)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2466 {
2615
4db544ffcbff *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2465
diff changeset
2467 DEBUG_PRINT1 ("\nCompiled pattern: \n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2468 print_compiled_pattern (bufp);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2469 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2470 #endif /* DEBUG */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2471
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
2472 #ifndef MATCH_MAY_ALLOCATE
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2473 /* Initialize the failure stack to the largest possible stack. This
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2474 isn't necessary unless we're trying to avoid calling alloca in
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2475 the search and match routines. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2476 {
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2477 int num_regs = bufp->re_nsub + 1;
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2478
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2479 /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2480 is strictly greater than re_max_failures, the largest possible stack
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2481 is 2 * re_max_failures failure points. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2482 fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2483 if (fail_stack.stack)
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2484 fail_stack.stack =
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2485 (fail_stack_elt_t *) realloc (fail_stack.stack,
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2486 (fail_stack.size
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2487 * sizeof (fail_stack_elt_t)));
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2488 else
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2489 fail_stack.stack =
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2490 (fail_stack_elt_t *) malloc (fail_stack.size
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2491 * sizeof (fail_stack_elt_t));
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2492
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2493 /* Initialize some other variables the matcher uses. */
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2494 RETALLOC_IF (regstart, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2495 RETALLOC_IF (regend, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2496 RETALLOC_IF (old_regstart, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2497 RETALLOC_IF (old_regend, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2498 RETALLOC_IF (best_regstart, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2499 RETALLOC_IF (best_regend, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2500 RETALLOC_IF (reg_info, num_regs, register_info_type);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2501 RETALLOC_IF (reg_dummy, num_regs, const char *);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2502 RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2503 }
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2504 #endif
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2505
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2506 return REG_NOERROR;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2507 } /* regex_compile */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2508
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2509 /* Subroutines for `regex_compile'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2510
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2511 /* Store OP at LOC followed by two-byte integer parameter ARG. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2512
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2513 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2514 store_op1 (op, loc, arg)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2515 re_opcode_t op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2516 unsigned char *loc;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2517 int arg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2518 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2519 *loc = (unsigned char) op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2520 STORE_NUMBER (loc + 1, arg);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2521 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2522
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2523
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2524 /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2525
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2526 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2527 store_op2 (op, loc, arg1, arg2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2528 re_opcode_t op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2529 unsigned char *loc;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2530 int arg1, arg2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2531 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2532 *loc = (unsigned char) op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2533 STORE_NUMBER (loc + 1, arg1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2534 STORE_NUMBER (loc + 3, arg2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2535 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2536
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2537
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2538 /* Copy the bytes from LOC to END to open up three bytes of space at LOC
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2539 for OP followed by two-byte integer parameter ARG. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2540
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2541 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2542 insert_op1 (op, loc, arg, end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2543 re_opcode_t op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2544 unsigned char *loc;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2545 int arg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2546 unsigned char *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2547 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2548 register unsigned char *pfrom = end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2549 register unsigned char *pto = end + 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2550
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2551 while (pfrom != loc)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2552 *--pto = *--pfrom;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2553
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2554 store_op1 (op, loc, arg);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2555 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2556
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2557
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2558 /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2559
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2560 static void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2561 insert_op2 (op, loc, arg1, arg2, end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2562 re_opcode_t op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2563 unsigned char *loc;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2564 int arg1, arg2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2565 unsigned char *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2566 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2567 register unsigned char *pfrom = end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2568 register unsigned char *pto = end + 5;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2569
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2570 while (pfrom != loc)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2571 *--pto = *--pfrom;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2572
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2573 store_op2 (op, loc, arg1, arg2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2574 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2575
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2576
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2577 /* P points to just after a ^ in PATTERN. Return true if that ^ comes
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2578 after an alternative or a begin-subexpression. We assume there is at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2579 least one character before the ^. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2580
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2581 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2582 at_begline_loc_p (pattern, p, syntax)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2583 const char *pattern, *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2584 reg_syntax_t syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2585 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2586 const char *prev = p - 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2587 boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2588
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2589 return
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2590 /* After a subexpression? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2591 (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2592 /* After an alternative? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2593 || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2594 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2595
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2596
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2597 /* The dual of at_begline_loc_p. This one is for $. We assume there is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2598 at least one character after the $, i.e., `P < PEND'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2599
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2600 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2601 at_endline_loc_p (p, pend, syntax)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2602 const char *p, *pend;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2603 int syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2604 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2605 const char *next = p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2606 boolean next_backslash = *next == '\\';
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2607 const char *next_next = p + 1 < pend ? p + 1 : NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2608
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2609 return
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2610 /* Before a subexpression? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2611 (syntax & RE_NO_BK_PARENS ? *next == ')'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2612 : next_backslash && next_next && *next_next == ')')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2613 /* Before an alternative? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2614 || (syntax & RE_NO_BK_VBAR ? *next == '|'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2615 : next_backslash && next_next && *next_next == '|');
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2616 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2617
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2618
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2619 /* Returns true if REGNUM is in one of COMPILE_STACK's elements and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2620 false if it's not. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2621
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2622 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2623 group_in_compile_stack (compile_stack, regnum)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2624 compile_stack_type compile_stack;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2625 regnum_t regnum;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2626 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2627 int this_element;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2628
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2629 for (this_element = compile_stack.avail - 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2630 this_element >= 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2631 this_element--)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2632 if (compile_stack.stack[this_element].regnum == regnum)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2633 return true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2634
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2635 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2636 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2637
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2638
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2639 /* Read the ending character of a range (in a bracket expression) from the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2640 uncompiled pattern *P_PTR (which ends at PEND). We assume the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2641 starting character is in `P[-2]'. (`P[-1]' is the character `-'.)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2642 Then we set the translation of all bits between the starting and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2643 ending characters (inclusive) in the compiled pattern B.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2644
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2645 Return an error code.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2646
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2647 We use these short variable names so we can use the same macros as
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2648 `regex_compile' itself. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2649
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2650 static reg_errcode_t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2651 compile_range (p_ptr, pend, translate, syntax, b)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2652 const char **p_ptr, *pend;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2653 char *translate;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2654 reg_syntax_t syntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2655 unsigned char *b;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2656 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2657 unsigned this_char;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2658
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2659 const char *p = *p_ptr;
1689
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2660 int range_start, range_end;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2661
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2662 if (p == pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2663 return REG_ERANGE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2664
1689
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2665 /* Even though the pattern is a signed `char *', we need to fetch
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2666 with unsigned char *'s; if the high bit of the pattern character
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2667 is set, the range endpoints will be negative if we fetch using a
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2668 signed char *.
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2669
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2670 We also want to fetch the endpoints without translating them; the
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2671 appropriate translation is done in the bit-setting loop below. */
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2672 range_start = ((unsigned char *) p)[-2];
5da6b5575f48 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1669
diff changeset
2673 range_end = ((unsigned char *) p)[0];
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2674
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2675 /* Have to increment the pointer into the pattern string, so the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2676 caller isn't still at the ending character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2677 (*p_ptr)++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2678
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2679 /* If the start is after the end, the range is empty. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2680 if (range_start > range_end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2681 return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2682
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2683 /* Here we see why `this_char' has to be larger than an `unsigned
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2684 char' -- the range is inclusive, so if `range_end' == 0xff
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2685 (assuming 8-bit characters), we would otherwise go into an infinite
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2686 loop, since all characters <= 0xff. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2687 for (this_char = range_start; this_char <= range_end; this_char++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2688 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2689 SET_LIST_BIT (TRANSLATE (this_char));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2690 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2691
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2692 return REG_NOERROR;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2693 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2694
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2695 /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2696 BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2697 characters can start a string that matches the pattern. This fastmap
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2698 is used by re_search to skip quickly over impossible starting points.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2699
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2700 The caller must supply the address of a (1 << BYTEWIDTH)-byte data
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2701 area as BUFP->fastmap.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2702
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2703 We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2704 the pattern buffer.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2705
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2706 Returns 0 if we succeed, -2 if an internal error. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2707
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2708 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2709 re_compile_fastmap (bufp)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2710 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2711 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2712 int j, k;
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
2713 #ifdef MATCH_MAY_ALLOCATE
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2714 fail_stack_type fail_stack;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
2715 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2716 #ifndef REGEX_MALLOC
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2717 char *destination;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2718 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2719 /* We don't push any register information onto the failure stack. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2720 unsigned num_regs = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2721
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2722 register char *fastmap = bufp->fastmap;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2723 unsigned char *pattern = bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2724 unsigned long size = bufp->used;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2725 const unsigned char *p = pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2726 register unsigned char *pend = pattern + size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2727
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2728 /* Assume that each path through the pattern can be null until
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2729 proven otherwise. We set this false at the bottom of switch
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2730 statement, to which we get only if a particular path doesn't
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2731 match the empty string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2732 boolean path_can_be_null = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2733
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2734 /* We aren't doing a `succeed_n' to begin with. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2735 boolean succeed_n_p = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2736
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2737 assert (fastmap != NULL && p != NULL);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2738
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2739 INIT_FAIL_STACK ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2740 bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2741 bufp->fastmap_accurate = 1; /* It will be when we're done. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2742 bufp->can_be_null = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2743
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2744 while (p != pend || !FAIL_STACK_EMPTY ())
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2745 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2746 if (p == pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2747 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2748 bufp->can_be_null |= path_can_be_null;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2749
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2750 /* Reset for next path. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2751 path_can_be_null = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2752
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2753 p = fail_stack.stack[--fail_stack.avail];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2754 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2755
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2756 /* We should never be about to go beyond the end of the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2757 assert (p < pend);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2758
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2759 #ifdef SWITCH_ENUM_BUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2760 switch ((int) ((re_opcode_t) *p++))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2761 #else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2762 switch ((re_opcode_t) *p++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2763 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2764 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2765
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2766 /* I guess the idea here is to simply not bother with a fastmap
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2767 if a backreference is used, since it's too hard to figure out
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2768 the fastmap for the corresponding group. Setting
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2769 `can_be_null' stops `re_search_2' from using the fastmap, so
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2770 that is all we do. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2771 case duplicate:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2772 bufp->can_be_null = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2773 return 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2774
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2775
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2776 /* Following are the cases which match a character. These end
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2777 with `break'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2778
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2779 case exactn:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2780 fastmap[p[1]] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2781 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2782
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2783
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2784 case charset:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2785 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2786 if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2787 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2788 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2789
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2790
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2791 case charset_not:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2792 /* Chars beyond end of map must be allowed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2793 for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2794 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2795
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2796 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2797 if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2798 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2799 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2800
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2801
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2802 case wordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2803 for (j = 0; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2804 if (SYNTAX (j) == Sword)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2805 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2806 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2807
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2808
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2809 case notwordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2810 for (j = 0; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2811 if (SYNTAX (j) != Sword)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2812 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2813 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2814
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2815
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2816 case anychar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2817 /* `.' matches anything ... */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2818 for (j = 0; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2819 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2820
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2821 /* ... except perhaps newline. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2822 if (!(bufp->syntax & RE_DOT_NEWLINE))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2823 fastmap['\n'] = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2824
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2825 /* Return if we have already set `can_be_null'; if we have,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2826 then the fastmap is irrelevant. Something's wrong here. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2827 else if (bufp->can_be_null)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2828 return 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2829
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2830 /* Otherwise, have to check alternative paths. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2831 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2832
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2833
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2834 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2835 case syntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2836 k = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2837 for (j = 0; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2838 if (SYNTAX (j) == (enum syntaxcode) k)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2839 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2840 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2841
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2842
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2843 case notsyntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2844 k = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2845 for (j = 0; j < (1 << BYTEWIDTH); j++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2846 if (SYNTAX (j) != (enum syntaxcode) k)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2847 fastmap[j] = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2848 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2849
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2850
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2851 /* All cases after this match the empty string. These end with
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2852 `continue'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2853
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2854
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2855 case before_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2856 case at_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2857 case after_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2858 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2859 #endif /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2860
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2861
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2862 case no_op:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2863 case begline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2864 case endline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2865 case begbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2866 case endbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2867 case wordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2868 case notwordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2869 case wordbeg:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2870 case wordend:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2871 case push_dummy_failure:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2872 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2873
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2874
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2875 case jump_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2876 case pop_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2877 case maybe_pop_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2878 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2879 case jump_past_alt:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2880 case dummy_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2881 EXTRACT_NUMBER_AND_INCR (j, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2882 p += j;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2883 if (j > 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2884 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2885
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2886 /* Jump backward implies we just went through the body of a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2887 loop and matched nothing. Opcode jumped to should be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2888 `on_failure_jump' or `succeed_n'. Just treat it like an
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2889 ordinary jump. For a * loop, it has pushed its failure
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2890 point already; if so, discard that as redundant. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2891 if ((re_opcode_t) *p != on_failure_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2892 && (re_opcode_t) *p != succeed_n)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2893 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2894
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2895 p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2896 EXTRACT_NUMBER_AND_INCR (j, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2897 p += j;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2898
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2899 /* If what's on the stack is where we are now, pop it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2900 if (!FAIL_STACK_EMPTY ()
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2901 && fail_stack.stack[fail_stack.avail - 1] == p)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2902 fail_stack.avail--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2903
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2904 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2905
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2906
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2907 case on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2908 case on_failure_keep_string_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2909 handle_on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2910 EXTRACT_NUMBER_AND_INCR (j, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2911
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2912 /* For some patterns, e.g., `(a?)?', `p+j' here points to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2913 end of the pattern. We don't want to push such a point,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2914 since when we restore it above, entering the switch will
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2915 increment `p' past the end of the pattern. We don't need
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2916 to push such a point since we obviously won't find any more
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2917 fastmap entries beyond `pend'. Such a pattern can match
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2918 the null string, though. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2919 if (p + j < pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2920 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2921 if (!PUSH_PATTERN_OP (p + j, fail_stack))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2922 return -2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2923 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2924 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2925 bufp->can_be_null = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2926
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2927 if (succeed_n_p)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2928 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2929 EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2930 succeed_n_p = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2931 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2932
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2933 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2934
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2935
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2936 case succeed_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2937 /* Get to the number of times to succeed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2938 p += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2939
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2940 /* Increment p past the n for when k != 0. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2941 EXTRACT_NUMBER_AND_INCR (k, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2942 if (k == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2943 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2944 p -= 4;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2945 succeed_n_p = true; /* Spaghetti code alert. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2946 goto handle_on_failure_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2947 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2948 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2949
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2950
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2951 case set_number_at:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2952 p += 4;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2953 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2954
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2955
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2956 case start_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2957 case stop_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2958 p += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2959 continue;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2960
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2961
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2962 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2963 abort (); /* We have listed all the cases. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2964 } /* switch *p++ */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2965
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2966 /* Getting here means we have found the possible starting
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2967 characters for one path of the pattern -- and that the empty
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2968 string does not match. We need not follow this path further.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2969 Instead, look at the next alternative (remembered on the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2970 stack), or quit if no more. The test at the top of the loop
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2971 does these things. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2972 path_can_be_null = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2973 p = pend;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2974 } /* while p */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2975
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2976 /* Set `can_be_null' for the last path (also the first path, if the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2977 pattern is empty). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2978 bufp->can_be_null |= path_can_be_null;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2979 return 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2980 } /* re_compile_fastmap */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2981
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2982 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2983 ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2984 this memory for recording register information. STARTS and ENDS
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2985 must be allocated using the malloc library routine, and must each
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2986 be at least NUM_REGS * sizeof (regoff_t) bytes long.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2987
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2988 If NUM_REGS == 0, then subsequent matches should allocate their own
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2989 register data.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2990
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2991 Unless this function is called, the first search or match using
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2992 PATTERN_BUFFER will allocate its own register data, without
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2993 freeing the old data. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2994
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2995 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2996 re_set_registers (bufp, regs, num_regs, starts, ends)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2997 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2998 struct re_registers *regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
2999 unsigned num_regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3000 regoff_t *starts, *ends;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3001 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3002 if (num_regs)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3003 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3004 bufp->regs_allocated = REGS_REALLOCATE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3005 regs->num_regs = num_regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3006 regs->start = starts;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3007 regs->end = ends;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3008 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3009 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3010 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3011 bufp->regs_allocated = REGS_UNALLOCATED;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3012 regs->num_regs = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3013 regs->start = regs->end = (regoff_t) 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3014 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3015 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3016
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3017 /* Searching routines. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3018
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3019 /* Like re_search_2, below, but only one string is specified, and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3020 doesn't let you say where to stop matching. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3021
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3022 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3023 re_search (bufp, string, size, startpos, range, regs)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3024 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3025 const char *string;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3026 int size, startpos, range;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3027 struct re_registers *regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3028 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3029 return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3030 regs, size);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3031 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3032
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3033
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3034 /* Using the compiled pattern in BUFP->buffer, first tries to match the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3035 virtual concatenation of STRING1 and STRING2, starting first at index
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3036 STARTPOS, then at STARTPOS + 1, and so on.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3037
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3038 STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3039
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3040 RANGE is how far to scan while trying to match. RANGE = 0 means try
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3041 only at STARTPOS; in general, the last start tried is STARTPOS +
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3042 RANGE.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3043
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3044 In REGS, return the indices of the virtual concatenation of STRING1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3045 and STRING2 that matched the entire BUFP->buffer and its contained
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3046 subexpressions.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3047
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3048 Do not consider matching one past the index STOP in the virtual
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3049 concatenation of STRING1 and STRING2.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3050
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3051 We return either the position in the strings at which the match was
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3052 found, -1 if no match, or -2 if error (such as failure
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3053 stack overflow). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3054
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3055 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3056 re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3057 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3058 const char *string1, *string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3059 int size1, size2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3060 int startpos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3061 int range;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3062 struct re_registers *regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3063 int stop;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3064 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3065 int val;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3066 register char *fastmap = bufp->fastmap;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3067 register char *translate = bufp->translate;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3068 int total_size = size1 + size2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3069 int endpos = startpos + range;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3070
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3071 /* Check for out-of-range STARTPOS. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3072 if (startpos < 0 || startpos > total_size)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3073 return -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3074
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3075 /* Fix up RANGE if it might eventually take us outside
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3076 the virtual concatenation of STRING1 and STRING2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3077 if (endpos < -1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3078 range = -1 - startpos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3079 else if (endpos > total_size)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3080 range = total_size - startpos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3081
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3082 /* If the search isn't to be a backwards one, don't waste time in a
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3083 search for a pattern that must be anchored. */
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3084 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3085 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3086 if (startpos > 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3087 return -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3088 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3089 range = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3090 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3091
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3092 /* Update the fastmap now if not correct already. */
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3093 if (fastmap && !bufp->fastmap_accurate)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3094 if (re_compile_fastmap (bufp) == -2)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3095 return -2;
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3096
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3097 /* Loop through the string, looking for a place to start matching. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3098 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3099 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3100 /* If a fastmap is supplied, skip quickly over characters that
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3101 cannot be the start of a match. If the pattern can match the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3102 null string, however, we don't need to skip characters; we want
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3103 the first null string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3104 if (fastmap && startpos < total_size && !bufp->can_be_null)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3105 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3106 if (range > 0) /* Searching forwards. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3107 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3108 register const char *d;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3109 register int lim = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3110 int irange = range;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3111
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3112 if (startpos < size1 && startpos + range >= size1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3113 lim = range - (size1 - startpos);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3114
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3115 d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3116
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3117 /* Written out as an if-else to avoid testing `translate'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3118 inside the loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3119 if (translate)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3120 while (range > lim
2078
4bf349812f55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1738
diff changeset
3121 && !fastmap[(unsigned char)
4bf349812f55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1738
diff changeset
3122 translate[(unsigned char) *d++]])
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3123 range--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3124 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3125 while (range > lim && !fastmap[(unsigned char) *d++])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3126 range--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3127
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3128 startpos += irange - range;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3129 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3130 else /* Searching backwards. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3131 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3132 register char c = (size1 == 0 || startpos >= size1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3133 ? string2[startpos - size1]
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3134 : string1[startpos]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3135
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3136 if (!fastmap[(unsigned char) TRANSLATE (c)])
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3137 goto advance;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3138 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3139 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3140
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3141 /* If can't match the null string, and that's all we have left, fail. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3142 if (range >= 0 && startpos == total_size && fastmap
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3143 && !bufp->can_be_null)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3144 return -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3145
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3146 val = re_match_2 (bufp, string1, size1, string2, size2,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3147 startpos, regs, stop);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3148 if (val >= 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3149 return startpos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3150
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3151 if (val == -2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3152 return -2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3153
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3154 advance:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3155 if (!range)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3156 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3157 else if (range > 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3158 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3159 range--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3160 startpos++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3161 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3162 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3163 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3164 range++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3165 startpos--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3166 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3167 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3168 return -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3169 } /* re_search_2 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3170
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3171 /* Declarations and macros for re_match_2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3172
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3173 static int bcmp_translate ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3174 static boolean alt_match_null_string_p (),
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3175 common_op_match_null_string_p (),
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3176 group_match_null_string_p ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3177
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3178 /* This converts PTR, a pointer into one of the search strings `string1'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3179 and `string2' into an offset from the beginning of that string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3180 #define POINTER_TO_OFFSET(ptr) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3181 (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3182
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3183 /* Macros for dealing with the split strings in re_match_2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3184
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3185 #define MATCHING_IN_FIRST_STRING (dend == end_match_1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3186
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3187 /* Call before fetching a character with *d. This switches over to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3188 string2 if necessary. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3189 #define PREFETCH() \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3190 while (d == dend) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3191 { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3192 /* End of string2 => fail. */ \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3193 if (dend == end_match_2) \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3194 goto fail; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3195 /* End of string1 => advance to string2. */ \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3196 d = string2; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3197 dend = end_match_2; \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3198 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3199
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3200
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3201 /* Test if at very beginning or at very end of the virtual concatenation
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3202 of `string1' and `string2'. If only one string, it's `string2'. */
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3203 #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3204 #define AT_STRINGS_END(d) ((d) == end2)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3205
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3206
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3207 /* Test if D points to a character which is word-constituent. We have
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3208 two special cases to check for: if past the end of string1, look at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3209 the first character in string2; and if before the beginning of
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3210 string2, look at the last character in string1. */
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3211 #define WORDCHAR_P(d) \
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3212 (SYNTAX ((d) == end1 ? *string2 \
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3213 : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3214 == Sword)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3215
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3216 /* Test if the character before D and the one at D differ with respect
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3217 to being word-constituent. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3218 #define AT_WORD_BOUNDARY(d) \
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3219 (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3220 || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3221
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3222
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3223 /* Free everything we malloc. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3224 #ifdef MATCH_MAY_ALLOCATE
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3225 #ifdef REGEX_MALLOC
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3226 #define FREE_VAR(var) if (var) free (var); var = NULL
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3227 #define FREE_VARIABLES() \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3228 do { \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3229 FREE_VAR (fail_stack.stack); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3230 FREE_VAR (regstart); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3231 FREE_VAR (regend); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3232 FREE_VAR (old_regstart); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3233 FREE_VAR (old_regend); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3234 FREE_VAR (best_regstart); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3235 FREE_VAR (best_regend); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3236 FREE_VAR (reg_info); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3237 FREE_VAR (reg_dummy); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3238 FREE_VAR (reg_info_dummy); \
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3239 } while (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3240 #else /* not REGEX_MALLOC */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3241 /* Some MIPS systems (at least) want this to free alloca'd storage. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3242 #define FREE_VARIABLES() alloca (0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3243 #endif /* not REGEX_MALLOC */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3244 #else
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3245 #define FREE_VARIABLES() /* Do nothing! */
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3246 #endif /* not MATCH_MAY_ALLOCATE */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3247
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3248 /* These values must meet several constraints. They must not be valid
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3249 register values; since we have a limit of 255 registers (because
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3250 we use only one byte in the pattern for the register number), we can
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3251 use numbers larger than 255. They must differ by 1, because of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3252 NUM_FAILURE_ITEMS above. And the value for the lowest register must
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3253 be larger than the value for the highest register, so we do not try
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3254 to actually save any registers when none are active. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3255 #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3256 #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3257
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3258 /* Matching routines. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3259
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3260 #ifndef emacs /* Emacs never uses this. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3261 /* re_match is like re_match_2 except it takes only a single string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3262
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3263 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3264 re_match (bufp, string, size, pos, regs)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3265 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3266 const char *string;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3267 int size, pos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3268 struct re_registers *regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3269 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3270 return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3271 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3272 #endif /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3273
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3274
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3275 /* re_match_2 matches the compiled pattern in BUFP against the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3276 the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3277 and SIZE2, respectively). We start matching at POS, and stop
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3278 matching at STOP.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3279
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3280 If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3281 store offsets for the substring each group matched in REGS. See the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3282 documentation for exactly how many groups we fill.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3283
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3284 We return -1 if no match, -2 if an internal error (such as the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3285 failure stack overflowing). Otherwise, we return the length of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3286 matched substring. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3287
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3288 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3289 re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3290 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3291 const char *string1, *string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3292 int size1, size2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3293 int pos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3294 struct re_registers *regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3295 int stop;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3296 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3297 /* General temporaries. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3298 int mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3299 unsigned char *p1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3300
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3301 /* Just past the end of the corresponding string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3302 const char *end1, *end2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3303
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3304 /* Pointers into string1 and string2, just past the last characters in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3305 each to consider matching. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3306 const char *end_match_1, *end_match_2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3307
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3308 /* Where we are in the data, and the end of the current string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3309 const char *d, *dend;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3310
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3311 /* Where we are in the pattern, and the end of the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3312 unsigned char *p = bufp->buffer;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3313 register unsigned char *pend = p + bufp->used;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3314
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3315 /* We use this to map every character in the string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3316 char *translate = bufp->translate;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3317
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3318 /* Failure point stack. Each place that can handle a failure further
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3319 down the line pushes a failure point on this stack. It consists of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3320 restart, regend, and reg_info for all registers corresponding to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3321 the subexpressions we're currently inside, plus the number of such
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3322 registers, and, finally, two char *'s. The first char * is where
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3323 to resume scanning the pattern; the second one is where to resume
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3324 scanning the strings. If the latter is zero, the failure point is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3325 a ``dummy''; if a failure happens and the failure point is a dummy,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3326 it gets discarded and the next next one is tried. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3327 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3328 fail_stack_type fail_stack;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3329 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3330 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3331 static unsigned failure_id = 0;
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3332 unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3333 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3334
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3335 /* We fill all the registers internally, independent of what we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3336 return, for use in backreferences. The number here includes
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3337 an element for register zero. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3338 unsigned num_regs = bufp->re_nsub + 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3339
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3340 /* The currently active registers. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3341 unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3342 unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3343
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3344 /* Information on the contents of registers. These are pointers into
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3345 the input strings; they record just what was matched (on this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3346 attempt) by a subexpression part of the pattern, that is, the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3347 regnum-th regstart pointer points to where in the pattern we began
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3348 matching and the regnum-th regend points to right after where we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3349 stopped matching the regnum-th subexpression. (The zeroth register
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3350 keeps track of what the whole pattern matches.) */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3351 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3352 const char **regstart, **regend;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3353 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3354
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3355 /* If a group that's operated upon by a repetition operator fails to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3356 match anything, then the register for its start will need to be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3357 restored because it will have been set to wherever in the string we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3358 are when we last see its open-group operator. Similarly for a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3359 register's end. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3360 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3361 const char **old_regstart, **old_regend;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3362 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3363
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3364 /* The is_active field of reg_info helps us keep track of which (possibly
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3365 nested) subexpressions we are currently in. The matched_something
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3366 field of reg_info[reg_num] helps us tell whether or not we have
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3367 matched any of the pattern so far this time through the reg_num-th
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3368 subexpression. These two fields get reset each time through any
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3369 loop their register is in. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3370 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3371 register_info_type *reg_info;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3372 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3373
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3374 /* The following record the register info as found in the above
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3375 variables when we find a match better than any we've seen before.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3376 This happens as we backtrack through the failure points, which in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3377 turn happens only if we have not yet matched the entire string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3378 unsigned best_regs_set = false;
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3379 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3380 const char **best_regstart, **best_regend;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3381 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3382
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3383 /* Logically, this is `best_regend[0]'. But we don't want to have to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3384 allocate space for that if we're not allocating space for anything
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3385 else (see below). Also, we never need info about register 0 for
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3386 any of the other register vectors, and it seems rather a kludge to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3387 treat `best_regend' differently than the rest. So we keep track of
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3388 the end of the best match so far in a separate variable. We
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3389 initialize this to NULL so that when we backtrack the first time
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3390 and need to test it, it's not garbage. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3391 const char *match_end = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3392
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3393 /* Used when we pop values we don't care about. */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3394 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3395 const char **reg_dummy;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3396 register_info_type *reg_info_dummy;
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3397 #endif
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3398
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3399 #ifdef DEBUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3400 /* Counts the total number of registers pushed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3401 unsigned num_regs_pushed = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3402 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3403
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3404 DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3405
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3406 INIT_FAIL_STACK ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3407
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3408 #ifdef MATCH_MAY_ALLOCATE
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3409 /* Do not bother to initialize all the register variables if there are
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3410 no groups in the pattern, as it takes a fair amount of time. If
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3411 there are groups, we include space for register 0 (the whole
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3412 pattern), even though we never use it, since it simplifies the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3413 array indexing. We should fix this. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3414 if (bufp->re_nsub)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3415 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3416 regstart = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3417 regend = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3418 old_regstart = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3419 old_regend = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3420 best_regstart = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3421 best_regend = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3422 reg_info = REGEX_TALLOC (num_regs, register_info_type);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3423 reg_dummy = REGEX_TALLOC (num_regs, const char *);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3424 reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3425
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3426 if (!(regstart && regend && old_regstart && old_regend && reg_info
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3427 && best_regstart && best_regend && reg_dummy && reg_info_dummy))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3428 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3429 FREE_VARIABLES ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3430 return -2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3431 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3432 }
2949
632fcf130734 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2758
diff changeset
3433 #if defined (REGEX_MALLOC)
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3434 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3435 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3436 /* We must initialize all our variables to NULL, so that
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3437 `FREE_VARIABLES' doesn't try to free them. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3438 regstart = regend = old_regstart = old_regend = best_regstart
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3439 = best_regend = reg_dummy = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3440 reg_info = reg_info_dummy = (register_info_type *) NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3441 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3442 #endif /* REGEX_MALLOC */
2952
67fb1010352a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2951
diff changeset
3443 #endif /* MATCH_MAY_ALLOCATE */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3444
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3445 /* The starting position is bogus. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3446 if (pos < 0 || pos > size1 + size2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3447 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3448 FREE_VARIABLES ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3449 return -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3450 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3451
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3452 /* Initialize subexpression text positions to -1 to mark ones that no
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3453 start_memory/stop_memory has been seen for. Also initialize the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3454 register information struct. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3455 for (mcnt = 1; mcnt < num_regs; mcnt++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3456 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3457 regstart[mcnt] = regend[mcnt]
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3458 = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3459
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3460 REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3461 IS_ACTIVE (reg_info[mcnt]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3462 MATCHED_SOMETHING (reg_info[mcnt]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3463 EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3464 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3465
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3466 /* We move `string1' into `string2' if the latter's empty -- but not if
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3467 `string1' is null. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3468 if (size2 == 0 && string1 != NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3469 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3470 string2 = string1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3471 size2 = size1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3472 string1 = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3473 size1 = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3474 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3475 end1 = string1 + size1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3476 end2 = string2 + size2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3477
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3478 /* Compute where to stop matching, within the two strings. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3479 if (stop <= size1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3480 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3481 end_match_1 = string1 + stop;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3482 end_match_2 = string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3483 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3484 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3485 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3486 end_match_1 = end1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3487 end_match_2 = string2 + stop - size1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3488 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3489
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3490 /* `p' scans through the pattern as `d' scans through the data.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3491 `dend' is the end of the input string that `d' points within. `d'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3492 is advanced into the following input string whenever necessary, but
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3493 this happens before fetching; therefore, at the beginning of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3494 loop, `d' can be pointing at the end of a string, but it cannot
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3495 equal `string2'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3496 if (size1 > 0 && pos <= size1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3497 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3498 d = string1 + pos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3499 dend = end_match_1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3500 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3501 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3502 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3503 d = string2 + pos - size1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3504 dend = end_match_2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3505 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3506
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3507 DEBUG_PRINT1 ("The compiled pattern is: ");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3508 DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3509 DEBUG_PRINT1 ("The string to match is: `");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3510 DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3511 DEBUG_PRINT1 ("'\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3512
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3513 /* This loops over pattern commands. It exits by returning from the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3514 function if the match is complete, or it drops through if the match
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3515 fails at this starting point in the input data. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3516 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3517 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3518 DEBUG_PRINT2 ("\n0x%x: ", p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3519
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3520 if (p == pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3521 { /* End of pattern means we might have succeeded. */
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3522 DEBUG_PRINT1 ("end of pattern ... ");
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3523
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3524 /* If we haven't matched the entire string, and we want the
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3525 longest match, try backtracking. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3526 if (d != end_match_2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3527 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3528 DEBUG_PRINT1 ("backtracking.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3529
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3530 if (!FAIL_STACK_EMPTY ())
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3531 { /* More failure points to try. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3532 boolean same_str_p = (FIRST_STRING_P (match_end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3533 == MATCHING_IN_FIRST_STRING);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3534
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3535 /* If exceeds best match so far, save it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3536 if (!best_regs_set
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3537 || (same_str_p && d > match_end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3538 || (!same_str_p && !MATCHING_IN_FIRST_STRING))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3539 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3540 best_regs_set = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3541 match_end = d;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3542
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3543 DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3544
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3545 for (mcnt = 1; mcnt < num_regs; mcnt++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3546 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3547 best_regstart[mcnt] = regstart[mcnt];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3548 best_regend[mcnt] = regend[mcnt];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3549 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3550 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3551 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3552 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3553
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3554 /* If no failure points, don't restore garbage. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3555 else if (best_regs_set)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3556 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3557 restore_best_regs:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3558 /* Restore best match. It may happen that `dend ==
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3559 end_match_1' while the restored d is in string2.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3560 For example, the pattern `x.*y.*z' against the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3561 strings `x-' and `y-z-', if the two strings are
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3562 not consecutive in memory. */
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3563 DEBUG_PRINT1 ("Restoring best registers.\n");
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3564
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3565 d = match_end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3566 dend = ((d >= string1 && d <= end1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3567 ? end_match_1 : end_match_2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3568
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3569 for (mcnt = 1; mcnt < num_regs; mcnt++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3570 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3571 regstart[mcnt] = best_regstart[mcnt];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3572 regend[mcnt] = best_regend[mcnt];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3573 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3574 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3575 } /* d != end_match_2 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3576
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3577 DEBUG_PRINT1 ("Accepting match.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3578
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3579 /* If caller wants register contents data back, do it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3580 if (regs && !bufp->no_sub)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3581 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3582 /* Have the register data arrays been allocated? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3583 if (bufp->regs_allocated == REGS_UNALLOCATED)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3584 { /* No. So allocate them with malloc. We need one
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3585 extra element beyond `num_regs' for the `-1' marker
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3586 GNU code uses. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3587 regs->num_regs = MAX (RE_NREGS, num_regs + 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3588 regs->start = TALLOC (regs->num_regs, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3589 regs->end = TALLOC (regs->num_regs, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3590 if (regs->start == NULL || regs->end == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3591 return -2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3592 bufp->regs_allocated = REGS_REALLOCATE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3593 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3594 else if (bufp->regs_allocated == REGS_REALLOCATE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3595 { /* Yes. If we need more elements than were already
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3596 allocated, reallocate them. If we need fewer, just
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3597 leave it alone. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3598 if (regs->num_regs < num_regs + 1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3599 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3600 regs->num_regs = num_regs + 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3601 RETALLOC (regs->start, regs->num_regs, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3602 RETALLOC (regs->end, regs->num_regs, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3603 if (regs->start == NULL || regs->end == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3604 return -2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3605 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3606 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3607 else
2465
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
3608 {
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
3609 /* These braces fend off a "empty body in an else-statement"
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
3610 warning under GCC when assert expands to nothing. */
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
3611 assert (bufp->regs_allocated == REGS_FIXED);
cc54f01475dd *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2454
diff changeset
3612 }
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3613
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3614 /* Convert the pointer data in `regstart' and `regend' to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3615 indices. Register zero has to be set differently,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3616 since we haven't kept track of any info for it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3617 if (regs->num_regs > 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3618 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3619 regs->start[0] = pos;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3620 regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3621 : d - string2 + size1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3622 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3623
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3624 /* Go through the first `min (num_regs, regs->num_regs)'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3625 registers, since that is all we initialized. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3626 for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3627 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3628 if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3629 regs->start[mcnt] = regs->end[mcnt] = -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3630 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3631 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3632 regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3633 regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3634 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3635 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3636
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3637 /* If the regs structure we return has more elements than
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3638 were in the pattern, set the extra elements to -1. If
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3639 we (re)allocated the registers, this is the case,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3640 because we always allocate enough to have at least one
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3641 -1 at the end. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3642 for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3643 regs->start[mcnt] = regs->end[mcnt] = -1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3644 } /* regs && !bufp->no_sub */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3645
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3646 FREE_VARIABLES ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3647 DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3648 nfailure_points_pushed, nfailure_points_popped,
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3649 nfailure_points_pushed - nfailure_points_popped);
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3650 DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3651
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3652 mcnt = d - pos - (MATCHING_IN_FIRST_STRING
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3653 ? string1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3654 : string2 - size1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3655
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3656 DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3657
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3658 return mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3659 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3660
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3661 /* Otherwise match next pattern command. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3662 #ifdef SWITCH_ENUM_BUG
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3663 switch ((int) ((re_opcode_t) *p++))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3664 #else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3665 switch ((re_opcode_t) *p++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3666 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3667 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3668 /* Ignore these. Used to ignore the n of succeed_n's which
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3669 currently have n == 0. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3670 case no_op:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3671 DEBUG_PRINT1 ("EXECUTING no_op.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3672 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3673
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3674
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3675 /* Match the next n pattern characters exactly. The following
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3676 byte in the pattern defines n, and the n bytes after that
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3677 are the characters to match. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3678 case exactn:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3679 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3680 DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3681
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3682 /* This is written out as an if-else so we don't waste time
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3683 testing `translate' inside the loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3684 if (translate)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3685 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3686 do
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3687 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3688 PREFETCH ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3689 if (translate[(unsigned char) *d++] != (char) *p++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3690 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3691 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3692 while (--mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3693 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3694 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3695 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3696 do
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3697 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3698 PREFETCH ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3699 if (*d++ != (char) *p++) goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3700 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3701 while (--mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3702 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3703 SET_REGS_MATCHED ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3704 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3705
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3706
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3707 /* Match any character except possibly a newline or a null. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3708 case anychar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3709 DEBUG_PRINT1 ("EXECUTING anychar.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3710
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3711 PREFETCH ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3712
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3713 if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3714 || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3715 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3716
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3717 SET_REGS_MATCHED ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3718 DEBUG_PRINT2 (" Matched `%d'.\n", *d);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3719 d++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3720 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3721
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3722
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3723 case charset:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3724 case charset_not:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3725 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3726 register unsigned char c;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3727 boolean not = (re_opcode_t) *(p - 1) == charset_not;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3728
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3729 DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3730
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3731 PREFETCH ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3732 c = TRANSLATE (*d); /* The character to match. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3733
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3734 /* Cast to `unsigned' instead of `unsigned char' in case the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3735 bit list is a full 32 bytes long. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3736 if (c < (unsigned) (*p * BYTEWIDTH)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3737 && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3738 not = !not;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3739
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3740 p += 1 + *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3741
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3742 if (!not) goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3743
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3744 SET_REGS_MATCHED ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3745 d++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3746 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3747 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3748
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3749
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3750 /* The beginning of a group is represented by start_memory.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3751 The arguments are the register number in the next byte, and the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3752 number of groups inner to this one in the next. The text
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3753 matched within the group is recorded (in the internal
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3754 registers data structure) under the register number. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3755 case start_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3756 DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3757
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3758 /* Find out if this group can match the empty string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3759 p1 = p; /* To send to group_match_null_string_p. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3760
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3761 if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3762 REG_MATCH_NULL_STRING_P (reg_info[*p])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3763 = group_match_null_string_p (&p1, pend, reg_info);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3764
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3765 /* Save the position in the string where we were the last time
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3766 we were at this open-group operator in case the group is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3767 operated upon by a repetition operator, e.g., with `(a*)*b'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3768 against `ab'; then we want to ignore where we are now in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3769 the string in case this attempt to match fails. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3770 old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3771 ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3772 : regstart[*p];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3773 DEBUG_PRINT2 (" old_regstart: %d\n",
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3774 POINTER_TO_OFFSET (old_regstart[*p]));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3775
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3776 regstart[*p] = d;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3777 DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3778
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3779 IS_ACTIVE (reg_info[*p]) = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3780 MATCHED_SOMETHING (reg_info[*p]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3781
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3782 /* This is the new highest active register. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3783 highest_active_reg = *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3784
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3785 /* If nothing was active before, this is the new lowest active
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3786 register. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3787 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3788 lowest_active_reg = *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3789
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3790 /* Move past the register number and inner group count. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3791 p += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3792 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3793
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3794
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3795 /* The stop_memory opcode represents the end of a group. Its
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3796 arguments are the same as start_memory's: the register
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3797 number, and the number of inner groups. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3798 case stop_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3799 DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3800
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3801 /* We need to save the string position the last time we were at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3802 this close-group operator in case the group is operated
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3803 upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3804 against `aba'; then we want to ignore where we are now in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3805 the string in case this attempt to match fails. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3806 old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3807 ? REG_UNSET (regend[*p]) ? d : regend[*p]
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3808 : regend[*p];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3809 DEBUG_PRINT2 (" old_regend: %d\n",
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3810 POINTER_TO_OFFSET (old_regend[*p]));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3811
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3812 regend[*p] = d;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3813 DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3814
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3815 /* This register isn't active anymore. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3816 IS_ACTIVE (reg_info[*p]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3817
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3818 /* If this was the only register active, nothing is active
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3819 anymore. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3820 if (lowest_active_reg == highest_active_reg)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3821 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3822 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3823 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3824 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3825 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3826 { /* We must scan for the new highest active register, since
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3827 it isn't necessarily one less than now: consider
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3828 (a(b)c(d(e)f)g). When group 3 ends, after the f), the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3829 new highest active register is 1. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3830 unsigned char r = *p - 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3831 while (r > 0 && !IS_ACTIVE (reg_info[r]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3832 r--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3833
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3834 /* If we end up at register zero, that means that we saved
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3835 the registers as the result of an `on_failure_jump', not
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3836 a `start_memory', and we jumped to past the innermost
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3837 `stop_memory'. For example, in ((.)*) we save
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3838 registers 1 and 2 as a result of the *, but when we pop
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3839 back to the second ), we are at the stop_memory 1.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3840 Thus, nothing is active. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3841 if (r == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3842 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3843 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3844 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3845 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3846 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3847 highest_active_reg = r;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3848 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3849
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3850 /* If just failed to match something this time around with a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3851 group that's operated on by a repetition operator, try to
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3852 force exit from the ``loop'', and restore the register
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3853 information for this group that we had before trying this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3854 last match. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3855 if ((!MATCHED_SOMETHING (reg_info[*p])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3856 || (re_opcode_t) p[-3] == start_memory)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3857 && (p + 2) < pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3858 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3859 boolean is_a_jump_n = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3860
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3861 p1 = p + 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3862 mcnt = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3863 switch ((re_opcode_t) *p1++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3864 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3865 case jump_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3866 is_a_jump_n = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3867 case pop_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3868 case maybe_pop_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3869 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3870 case dummy_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3871 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3872 if (is_a_jump_n)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3873 p1 += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3874 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3875
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3876 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3877 /* do nothing */ ;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3878 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3879 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3880
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3881 /* If the next operation is a jump backwards in the pattern
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3882 to an on_failure_jump right before the start_memory
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3883 corresponding to this stop_memory, exit from the loop
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3884 by forcing a failure after pushing on the stack the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3885 on_failure_jump's jump in the pattern, and d. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3886 if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3887 && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3888 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3889 /* If this group ever matched anything, then restore
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3890 what its registers were before trying this last
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3891 failed match, e.g., with `(a*)*b' against `ab' for
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3892 regstart[1], and, e.g., with `((a*)*(b*)*)*'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3893 against `aba' for regend[3].
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3894
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3895 Also restore the registers for inner groups for,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3896 e.g., `((a*)(b*))*' against `aba' (register 3 would
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3897 otherwise get trashed). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3898
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3899 if (EVER_MATCHED_SOMETHING (reg_info[*p]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3900 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3901 unsigned r;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3902
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3903 EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3904
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3905 /* Restore this and inner groups' (if any) registers. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3906 for (r = *p; r < *p + *(p + 1); r++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3907 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3908 regstart[r] = old_regstart[r];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3909
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3910 /* xx why this test? */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3911 if ((int) old_regend[r] >= (int) regstart[r])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3912 regend[r] = old_regend[r];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3913 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3914 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3915 p1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3916 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3917 PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3918
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3919 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3920 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3921 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3922
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3923 /* Move past the register number and the inner group count. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3924 p += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3925 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3926
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3927
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3928 /* \<digit> has been turned into a `duplicate' command which is
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3929 followed by the numeric value of <digit> as the register number. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3930 case duplicate:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3931 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3932 register const char *d2, *dend2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3933 int regno = *p++; /* Get which register to match against. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3934 DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3935
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3936 /* Can't back reference a group which we've never matched. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3937 if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3938 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3939
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3940 /* Where in input to try to start matching. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3941 d2 = regstart[regno];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3942
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3943 /* Where to stop matching; if both the place to start and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3944 the place to stop matching are in the same string, then
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3945 set to the place to stop, otherwise, for now have to use
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3946 the end of the first string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3947
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3948 dend2 = ((FIRST_STRING_P (regstart[regno])
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3949 == FIRST_STRING_P (regend[regno]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3950 ? regend[regno] : end_match_1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3951 for (;;)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3952 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3953 /* If necessary, advance to next segment in register
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3954 contents. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3955 while (d2 == dend2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3956 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3957 if (dend2 == end_match_2) break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3958 if (dend2 == regend[regno]) break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3959
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3960 /* End of string1 => advance to string2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3961 d2 = string2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3962 dend2 = regend[regno];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3963 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3964 /* At end of register contents => success */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3965 if (d2 == dend2) break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3966
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3967 /* If necessary, advance to next segment in data. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3968 PREFETCH ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3969
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3970 /* How many characters left in this segment to match. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3971 mcnt = dend - d;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3972
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3973 /* Want how many consecutive characters we can match in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3974 one shot, so, if necessary, adjust the count. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3975 if (mcnt > dend2 - d2)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3976 mcnt = dend2 - d2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3977
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3978 /* Compare that many; failure if mismatch, else move
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3979 past them. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3980 if (translate
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3981 ? bcmp_translate (d, d2, mcnt, translate)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3982 : bcmp (d, d2, mcnt))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3983 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3984 d += mcnt, d2 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3985 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3986 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3987 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3988
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3989
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3990 /* begline matches the empty string at the beginning of the string
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3991 (unless `not_bol' is set in `bufp'), and, if
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3992 `newline_anchor' is set, after newlines. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3993 case begline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3994 DEBUG_PRINT1 ("EXECUTING begline.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3995
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
3996 if (AT_STRINGS_BEG (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3997 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3998 if (!bufp->not_bol) break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3999 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4000 else if (d[-1] == '\n' && bufp->newline_anchor)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4001 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4002 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4003 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4004 /* In all other cases, we fail. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4005 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4006
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4007
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4008 /* endline is the dual of begline. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4009 case endline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4010 DEBUG_PRINT1 ("EXECUTING endline.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4011
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4012 if (AT_STRINGS_END (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4013 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4014 if (!bufp->not_eol) break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4015 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4016
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4017 /* We have to ``prefetch'' the next character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4018 else if ((d == end1 ? *string2 : *d) == '\n'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4019 && bufp->newline_anchor)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4020 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4021 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4022 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4023 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4024
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4025
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4026 /* Match at the very beginning of the data. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4027 case begbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4028 DEBUG_PRINT1 ("EXECUTING begbuf.\n");
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4029 if (AT_STRINGS_BEG (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4030 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4031 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4032
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4033
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4034 /* Match at the very end of the data. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4035 case endbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4036 DEBUG_PRINT1 ("EXECUTING endbuf.\n");
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4037 if (AT_STRINGS_END (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4038 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4039 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4040
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4041
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4042 /* on_failure_keep_string_jump is used to optimize `.*\n'. It
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4043 pushes NULL as the value for the string on the stack. Then
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4044 `pop_failure_point' will keep the current value for the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4045 string, instead of restoring it. To see why, consider
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4046 matching `foo\nbar' against `.*\n'. The .* matches the foo;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4047 then the . fails against the \n. But the next thing we want
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4048 to do is match the \n against the \n; if we restored the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4049 string value, we would be back at the foo.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4050
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4051 Because this is used only in specific cases, we don't need to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4052 check all the things that `on_failure_jump' does, to make
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4053 sure the right things get saved on the stack. Hence we don't
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4054 share its code. The only reason to push anything on the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4055 stack at all is that otherwise we would have to change
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4056 `anychar's code to do something besides goto fail in this
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4057 case; that seems worse than this. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4058 case on_failure_keep_string_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4059 DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4060
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4061 EXTRACT_NUMBER_AND_INCR (mcnt, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4062 DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4063
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4064 PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4065 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4066
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4067
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4068 /* Uses of on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4069
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4070 Each alternative starts with an on_failure_jump that points
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4071 to the beginning of the next alternative. Each alternative
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4072 except the last ends with a jump that in effect jumps past
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4073 the rest of the alternatives. (They really jump to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4074 ending jump of the following alternative, because tensioning
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4075 these jumps is a hassle.)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4076
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4077 Repeats start with an on_failure_jump that points past both
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4078 the repetition text and either the following jump or
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4079 pop_failure_jump back to this on_failure_jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4080 case on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4081 on_failure:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4082 DEBUG_PRINT1 ("EXECUTING on_failure_jump");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4083
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4084 EXTRACT_NUMBER_AND_INCR (mcnt, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4085 DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4086
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4087 /* If this on_failure_jump comes right before a group (i.e.,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4088 the original * applied to a group), save the information
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4089 for that group and all inner ones, so that if we fail back
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4090 to this point, the group's information will be correct.
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4091 For example, in \(a*\)*\1, we need the preceding group,
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4092 and in \(\(a*\)b*\)\2, we need the inner group. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4093
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4094 /* We can't use `p' to check ahead because we push
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4095 a failure point to `p + mcnt' after we do this. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4096 p1 = p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4097
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4098 /* We need to skip no_op's before we look for the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4099 start_memory in case this on_failure_jump is happening as
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4100 the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4101 against aba. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4102 while (p1 < pend && (re_opcode_t) *p1 == no_op)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4103 p1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4104
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4105 if (p1 < pend && (re_opcode_t) *p1 == start_memory)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4106 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4107 /* We have a new highest active register now. This will
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4108 get reset at the start_memory we are about to get to,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4109 but we will have saved all the registers relevant to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4110 this repetition op, as described above. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4111 highest_active_reg = *(p1 + 1) + *(p1 + 2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4112 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4113 lowest_active_reg = *(p1 + 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4114 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4115
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4116 DEBUG_PRINT1 (":\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4117 PUSH_FAILURE_POINT (p + mcnt, d, -2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4118 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4119
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4120
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4121 /* A smart repeat ends with `maybe_pop_jump'.
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4122 We change it to either `pop_failure_jump' or `jump'. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4123 case maybe_pop_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4124 EXTRACT_NUMBER_AND_INCR (mcnt, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4125 DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4126 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4127 register unsigned char *p2 = p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4128
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4129 /* Compare the beginning of the repeat with what in the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4130 pattern follows its end. If we can establish that there
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4131 is nothing that they would both match, i.e., that we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4132 would have to backtrack because of (as in, e.g., `a*a')
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4133 then we can change to pop_failure_jump, because we'll
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4134 never have to backtrack.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4135
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4136 This is not true in the case of alternatives: in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4137 `(a|ab)*' we do need to backtrack to the `ab' alternative
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4138 (e.g., if the string was `ab'). But instead of trying to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4139 detect that here, the alternative has put on a dummy
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4140 failure point which is what we will end up popping. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4141
3541
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4142 /* Skip over open/close-group commands.
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4143 If what follows this loop is a ...+ construct,
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4144 look at what begins its body, since we will have to
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4145 match at least one of that. */
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4146 while (1)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4147 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4148 if (p2 + 2 < pend
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4149 && ((re_opcode_t) *p2 == stop_memory
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4150 || (re_opcode_t) *p2 == start_memory))
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4151 p2 += 3;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4152 else if (p2 + 6 < pend
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4153 && (re_opcode_t) *p2 == dummy_failure_jump)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4154 p2 += 6;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4155 else
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4156 break;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4157 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4158
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4159 p1 = p + mcnt;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4160 /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4161 to the `maybe_finalize_jump' of this case. Examine what
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4162 follows. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4163
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4164 /* If we're at the end of the pattern, we can change. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4165 if (p2 == pend)
1669
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4166 {
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4167 /* Consider what happens when matching ":\(.*\)"
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4168 against ":/". I don't really understand this code
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4169 yet. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4170 p[-3] = (unsigned char) pop_failure_jump;
1669
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4171 DEBUG_PRINT1
401c99f91a6c *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1668
diff changeset
4172 (" End of pattern: change to `pop_failure_jump'.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4173 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4174
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4175 else if ((re_opcode_t) *p2 == exactn
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4176 || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4177 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4178 register unsigned char c
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4179 = *p2 == (unsigned char) endline ? '\n' : p2[2];
3541
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4180
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4181 if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4182 {
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4183 p[-3] = (unsigned char) pop_failure_jump;
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4184 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4185 c, p1[5]);
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4186 }
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4187
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4188 else if ((re_opcode_t) p1[3] == charset
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4189 || (re_opcode_t) p1[3] == charset_not)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4190 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4191 int not = (re_opcode_t) p1[3] == charset_not;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4192
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4193 if (c < (unsigned char) (p1[4] * BYTEWIDTH)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4194 && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4195 not = !not;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4196
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4197 /* `not' is equal to 1 if c would match, which means
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4198 that we can't change to pop_failure_jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4199 if (!not)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4200 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4201 p[-3] = (unsigned char) pop_failure_jump;
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4202 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4203 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4204 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4205 }
3541
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4206 else if ((re_opcode_t) *p2 == charset)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4207 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4208 register unsigned char c
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4209 = *p2 == (unsigned char) endline ? '\n' : p2[2];
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4210
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4211 if ((re_opcode_t) p1[3] == exactn
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4212 && ! (p2[1] * BYTEWIDTH > p1[4]
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4213 && (p2[1 + p1[4] / BYTEWIDTH]
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4214 & (1 << (p1[4] % BYTEWIDTH)))))
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4215 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4216 p[-3] = (unsigned char) pop_failure_jump;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4217 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4218 c, p1[5]);
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4219 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4220
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4221 else if ((re_opcode_t) p1[3] == charset_not)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4222 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4223 int idx;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4224 /* We win if the charset_not inside the loop
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4225 lists every character listed in the charset after. */
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4226 for (idx = 0; idx < p2[1]; idx++)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4227 if (! (p2[2 + idx] == 0
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4228 || (idx < p1[4]
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4229 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4230 break;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4231
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4232 if (idx == p2[1])
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4233 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4234 p[-3] = (unsigned char) pop_failure_jump;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4235 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4236 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4237 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4238 else if ((re_opcode_t) p1[3] == charset)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4239 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4240 int idx;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4241 /* We win if the charset inside the loop
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4242 has no overlap with the one after the loop. */
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4243 for (idx = 0; idx < p2[1] && idx < p1[4]; idx++)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4244 if ((p2[2 + idx] & p1[5 + idx]) != 0)
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4245 break;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4246
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4247 if (idx == p2[1] || idx == p1[4])
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4248 {
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4249 p[-3] = (unsigned char) pop_failure_jump;
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4250 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4251 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4252 }
cb4aa2f13edd *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 2952
diff changeset
4253 }
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4254 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4255 p -= 2; /* Point at relative address again. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4256 if ((re_opcode_t) p[-1] != pop_failure_jump)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4257 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4258 p[-1] = (unsigned char) jump;
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4259 DEBUG_PRINT1 (" Match => jump.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4260 goto unconditional_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4261 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4262 /* Note fall through. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4263
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4264
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4265 /* The end of a simple repeat has a pop_failure_jump back to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4266 its matching on_failure_jump, where the latter will push a
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4267 failure point. The pop_failure_jump takes off failure
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4268 points put on by this pop_failure_jump's matching
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4269 on_failure_jump; we got through the pattern to here from the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4270 matching on_failure_jump, so didn't fail. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4271 case pop_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4272 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4273 /* We need to pass separate storage for the lowest and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4274 highest registers, even though we don't care about the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4275 actual values. Otherwise, we will restore only one
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4276 register from the stack, since lowest will == highest in
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4277 `pop_failure_point'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4278 unsigned dummy_low_reg, dummy_high_reg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4279 unsigned char *pdummy;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4280 const char *sdummy;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4281
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4282 DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4283 POP_FAILURE_POINT (sdummy, pdummy,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4284 dummy_low_reg, dummy_high_reg,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4285 reg_dummy, reg_dummy, reg_info_dummy);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4286 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4287 /* Note fall through. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4288
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4289
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4290 /* Unconditionally jump (without popping any failure points). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4291 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4292 unconditional_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4293 EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4294 DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4295 p += mcnt; /* Do the jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4296 DEBUG_PRINT2 ("(to 0x%x).\n", p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4297 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4298
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4299
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4300 /* We need this opcode so we can detect where alternatives end
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4301 in `group_match_null_string_p' et al. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4302 case jump_past_alt:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4303 DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4304 goto unconditional_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4305
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4306
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4307 /* Normally, the on_failure_jump pushes a failure point, which
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4308 then gets popped at pop_failure_jump. We will end up at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4309 pop_failure_jump, also, and with a pattern of, say, `a+', we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4310 are skipping over the on_failure_jump, so we have to push
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4311 something meaningless for pop_failure_jump to pop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4312 case dummy_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4313 DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4314 /* It doesn't matter what we push for the string here. What
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4315 the code at `fail' tests is the value for the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4316 PUSH_FAILURE_POINT (0, 0, -2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4317 goto unconditional_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4318
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4319
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4320 /* At the end of an alternative, we need to push a dummy failure
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4321 point in case we are followed by a `pop_failure_jump', because
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4322 we don't want the failure point for the alternative to be
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4323 popped. For example, matching `(a|ab)*' against `aab'
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4324 requires that we match the `ab' alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4325 case push_dummy_failure:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4326 DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4327 /* See comments just above at `dummy_failure_jump' about the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4328 two zeroes. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4329 PUSH_FAILURE_POINT (0, 0, -2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4330 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4331
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4332 /* Have to succeed matching what follows at least n times.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4333 After that, handle like `on_failure_jump'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4334 case succeed_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4335 EXTRACT_NUMBER (mcnt, p + 2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4336 DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4337
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4338 assert (mcnt >= 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4339 /* Originally, this is how many times we HAVE to succeed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4340 if (mcnt > 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4341 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4342 mcnt--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4343 p += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4344 STORE_NUMBER_AND_INCR (p, mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4345 DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4346 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4347 else if (mcnt == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4348 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4349 DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4350 p[2] = (unsigned char) no_op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4351 p[3] = (unsigned char) no_op;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4352 goto on_failure;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4353 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4354 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4355
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4356 case jump_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4357 EXTRACT_NUMBER (mcnt, p + 2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4358 DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4359
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4360 /* Originally, this is how many times we CAN jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4361 if (mcnt)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4362 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4363 mcnt--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4364 STORE_NUMBER (p + 2, mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4365 goto unconditional_jump;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4366 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4367 /* If don't have to jump any more, skip over the rest of command. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4368 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4369 p += 4;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4370 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4371
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4372 case set_number_at:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4373 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4374 DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4375
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4376 EXTRACT_NUMBER_AND_INCR (mcnt, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4377 p1 = p + mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4378 EXTRACT_NUMBER_AND_INCR (mcnt, p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4379 DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4380 STORE_NUMBER (p1, mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4381 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4382 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4383
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4384 case wordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4385 DEBUG_PRINT1 ("EXECUTING wordbound.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4386 if (AT_WORD_BOUNDARY (d))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4387 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4388 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4389
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4390 case notwordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4391 DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4392 if (AT_WORD_BOUNDARY (d))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4393 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4394 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4395
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4396 case wordbeg:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4397 DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4398 if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4399 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4400 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4401
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4402 case wordend:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4403 DEBUG_PRINT1 ("EXECUTING wordend.\n");
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4404 if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4405 && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4406 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4407 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4408
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4409 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4410 #ifdef emacs19
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4411 case before_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4412 DEBUG_PRINT1 ("EXECUTING before_dot.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4413 if (PTR_CHAR_POS ((unsigned char *) d) >= point)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4414 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4415 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4416
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4417 case at_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4418 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4419 if (PTR_CHAR_POS ((unsigned char *) d) != point)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4420 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4421 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4422
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4423 case after_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4424 DEBUG_PRINT1 ("EXECUTING after_dot.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4425 if (PTR_CHAR_POS ((unsigned char *) d) <= point)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4426 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4427 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4428 #else /* not emacs19 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4429 case at_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4430 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4431 if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4432 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4433 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4434 #endif /* not emacs19 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4435
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4436 case syntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4437 DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4438 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4439 goto matchsyntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4440
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4441 case wordchar:
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4442 DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4443 mcnt = (int) Sword;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4444 matchsyntax:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4445 PREFETCH ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4446 if (SYNTAX (*d++) != (enum syntaxcode) mcnt)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4447 goto fail;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4448 SET_REGS_MATCHED ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4449 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4450
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4451 case notsyntaxspec:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4452 DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4453 mcnt = *p++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4454 goto matchnotsyntax;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4455
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4456 case notwordchar:
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4457 DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4458 mcnt = (int) Sword;
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4459 matchnotsyntax:
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4460 PREFETCH ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4461 if (SYNTAX (*d++) == (enum syntaxcode) mcnt)
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4462 goto fail;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4463 SET_REGS_MATCHED ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4464 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4465
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4466 #else /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4467 case wordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4468 DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4469 PREFETCH ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4470 if (!WORDCHAR_P (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4471 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4472 SET_REGS_MATCHED ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4473 d++;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4474 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4475
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4476 case notwordchar:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4477 DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4478 PREFETCH ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4479 if (WORDCHAR_P (d))
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4480 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4481 SET_REGS_MATCHED ();
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
4482 d++;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4483 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4484 #endif /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4485
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4486 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4487 abort ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4488 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4489 continue; /* Successfully executed one pattern command; keep going. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4490
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4491
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4492 /* We goto here if a matching operation fails. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4493 fail:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4494 if (!FAIL_STACK_EMPTY ())
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4495 { /* A restart point is known. Restore to that state. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4496 DEBUG_PRINT1 ("\nFAIL:\n");
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4497 POP_FAILURE_POINT (d, p,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4498 lowest_active_reg, highest_active_reg,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4499 regstart, regend, reg_info);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4500
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4501 /* If this failure point is a dummy, try the next one. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4502 if (!p)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4503 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4504
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4505 /* If we failed to the end of the pattern, don't examine *p. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4506 assert (p <= pend);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4507 if (p < pend)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4508 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4509 boolean is_a_jump_n = false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4510
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4511 /* If failed to a backwards jump that's part of a repetition
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4512 loop, need to pop this failure point and use the next one. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4513 switch ((re_opcode_t) *p)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4514 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4515 case jump_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4516 is_a_jump_n = true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4517 case maybe_pop_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4518 case pop_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4519 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4520 p1 = p + 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4521 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4522 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4523
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4524 if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4525 || (!is_a_jump_n
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4526 && (re_opcode_t) *p1 == on_failure_jump))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4527 goto fail;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4528 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4529 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4530 /* do nothing */ ;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4531 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4532 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4533
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4534 if (d >= string1 && d <= end1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4535 dend = end_match_1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4536 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4537 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4538 break; /* Matching at this starting point really fails. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4539 } /* for (;;) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4540
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4541 if (best_regs_set)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4542 goto restore_best_regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4543
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4544 FREE_VARIABLES ();
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4545
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4546 return -1; /* Failure to match. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4547 } /* re_match_2 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4548
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4549 /* Subroutine definitions for re_match_2. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4550
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4551
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4552 /* We are passed P pointing to a register number after a start_memory.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4553
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4554 Return true if the pattern up to the corresponding stop_memory can
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4555 match the empty string, and false otherwise.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4556
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4557 If we find the matching stop_memory, sets P to point to one past its number.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4558 Otherwise, sets P to an undefined byte less than or equal to END.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4559
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4560 We don't handle duplicates properly (yet). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4561
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4562 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4563 group_match_null_string_p (p, end, reg_info)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4564 unsigned char **p, *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4565 register_info_type *reg_info;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4566 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4567 int mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4568 /* Point to after the args to the start_memory. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4569 unsigned char *p1 = *p + 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4570
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4571 while (p1 < end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4572 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4573 /* Skip over opcodes that can match nothing, and return true or
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4574 false, as appropriate, when we get to one that can't, or to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4575 matching stop_memory. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4576
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4577 switch ((re_opcode_t) *p1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4578 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4579 /* Could be either a loop or a series of alternatives. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4580 case on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4581 p1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4582 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4583
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4584 /* If the next operation is not a jump backwards in the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4585 pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4586
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4587 if (mcnt >= 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4588 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4589 /* Go through the on_failure_jumps of the alternatives,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4590 seeing if any of the alternatives cannot match nothing.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4591 The last alternative starts with only a jump,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4592 whereas the rest start with on_failure_jump and end
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4593 with a jump, e.g., here is the pattern for `a|b|c':
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4594
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4595 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4596 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4597 /exactn/1/c
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4598
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4599 So, we have to first go through the first (n-1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4600 alternatives and then deal with the last one separately. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4601
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4602
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4603 /* Deal with the first (n-1) alternatives, which start
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4604 with an on_failure_jump (see above) that jumps to right
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4605 past a jump_past_alt. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4606
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4607 while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4608 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4609 /* `mcnt' holds how many bytes long the alternative
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4610 is, including the ending `jump_past_alt' and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4611 its number. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4612
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4613 if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4614 reg_info))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4615 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4616
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4617 /* Move to right after this alternative, including the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4618 jump_past_alt. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4619 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4620
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4621 /* Break if it's the beginning of an n-th alternative
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4622 that doesn't begin with an on_failure_jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4623 if ((re_opcode_t) *p1 != on_failure_jump)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4624 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4625
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4626 /* Still have to check that it's not an n-th
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4627 alternative that starts with an on_failure_jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4628 p1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4629 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4630 if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4631 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4632 /* Get to the beginning of the n-th alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4633 p1 -= 3;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4634 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4635 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4636 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4637
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4638 /* Deal with the last alternative: go back and get number
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4639 of the `jump_past_alt' just before it. `mcnt' contains
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4640 the length of the alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4641 EXTRACT_NUMBER (mcnt, p1 - 2);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4642
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4643 if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4644 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4645
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4646 p1 += mcnt; /* Get past the n-th alternative. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4647 } /* if mcnt > 0 */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4648 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4649
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4650
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4651 case stop_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4652 assert (p1[1] == **p);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4653 *p = p1 + 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4654 return true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4655
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4656
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4657 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4658 if (!common_op_match_null_string_p (&p1, end, reg_info))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4659 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4660 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4661 } /* while p1 < end */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4662
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4663 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4664 } /* group_match_null_string_p */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4665
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4666
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4667 /* Similar to group_match_null_string_p, but doesn't deal with alternatives:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4668 It expects P to be the first byte of a single alternative and END one
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4669 byte past the last. The alternative can contain groups. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4670
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4671 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4672 alt_match_null_string_p (p, end, reg_info)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4673 unsigned char *p, *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4674 register_info_type *reg_info;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4675 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4676 int mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4677 unsigned char *p1 = p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4678
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4679 while (p1 < end)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4680 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4681 /* Skip over opcodes that can match nothing, and break when we get
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4682 to one that can't. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4683
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4684 switch ((re_opcode_t) *p1)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4685 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4686 /* It's a loop. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4687 case on_failure_jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4688 p1++;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4689 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4690 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4691 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4692
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4693 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4694 if (!common_op_match_null_string_p (&p1, end, reg_info))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4695 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4696 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4697 } /* while p1 < end */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4698
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4699 return true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4700 } /* alt_match_null_string_p */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4701
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4702
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4703 /* Deals with the ops common to group_match_null_string_p and
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4704 alt_match_null_string_p.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4705
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4706 Sets P to one after the op and its arguments, if any. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4707
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4708 static boolean
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4709 common_op_match_null_string_p (p, end, reg_info)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4710 unsigned char **p, *end;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4711 register_info_type *reg_info;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4712 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4713 int mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4714 boolean ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4715 int reg_no;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4716 unsigned char *p1 = *p;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4717
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4718 switch ((re_opcode_t) *p1++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4719 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4720 case no_op:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4721 case begline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4722 case endline:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4723 case begbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4724 case endbuf:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4725 case wordbeg:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4726 case wordend:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4727 case wordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4728 case notwordbound:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4729 #ifdef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4730 case before_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4731 case at_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4732 case after_dot:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4733 #endif
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4734 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4735
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4736 case start_memory:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4737 reg_no = *p1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4738 assert (reg_no > 0 && reg_no <= MAX_REGNUM);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4739 ret = group_match_null_string_p (&p1, end, reg_info);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4740
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4741 /* Have to set this here in case we're checking a group which
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4742 contains a group and a back reference to it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4743
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4744 if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4745 REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4746
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4747 if (!ret)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4748 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4749 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4750
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4751 /* If this is an optimized succeed_n for zero times, make the jump. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4752 case jump:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4753 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4754 if (mcnt >= 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4755 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4756 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4757 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4758 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4759
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4760 case succeed_n:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4761 /* Get to the number of times to succeed. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4762 p1 += 2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4763 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4764
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4765 if (mcnt == 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4766 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4767 p1 -= 4;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4768 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4769 p1 += mcnt;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4770 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4771 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4772 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4773 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4774
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4775 case duplicate:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4776 if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4777 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4778 break;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4779
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4780 case set_number_at:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4781 p1 += 4;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4782
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4783 default:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4784 /* All other opcodes mean we cannot match the empty string. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4785 return false;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4786 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4787
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4788 *p = p1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4789 return true;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4790 } /* common_op_match_null_string_p */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4791
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4792
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4793 /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4794 bytes; nonzero otherwise. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4795
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4796 static int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4797 bcmp_translate (s1, s2, len, translate)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4798 unsigned char *s1, *s2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4799 register int len;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4800 char *translate;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4801 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4802 register unsigned char *p1 = s1, *p2 = s2;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4803 while (len)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4804 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4805 if (translate[*p1++] != translate[*p2++]) return 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4806 len--;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4807 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4808 return 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4809 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4810
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4811 /* Entry points for GNU code. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4812
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4813 /* re_compile_pattern is the GNU regular expression compiler: it
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4814 compiles PATTERN (of length SIZE) and puts the result in BUFP.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4815 Returns 0 if the pattern was valid, otherwise an error string.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4816
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4817 Assumes the `allocated' (and perhaps `buffer') and `translate' fields
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4818 are set in BUFP on entry.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4819
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4820 We call regex_compile to do the actual compilation. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4821
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4822 const char *
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4823 re_compile_pattern (pattern, length, bufp)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4824 const char *pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4825 int length;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4826 struct re_pattern_buffer *bufp;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4827 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4828 reg_errcode_t ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4829
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4830 /* GNU code is written to assume at least RE_NREGS registers will be set
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4831 (and at least one extra will be -1). */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4832 bufp->regs_allocated = REGS_UNALLOCATED;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4833
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4834 /* And GNU code determines whether or not to get register information
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4835 by passing null for the REGS argument to re_match, etc., not by
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4836 setting no_sub. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4837 bufp->no_sub = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4838
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4839 /* Match anchors at newline. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4840 bufp->newline_anchor = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4841
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4842 ret = regex_compile (pattern, length, re_syntax_options, bufp);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4843
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4844 return re_error_msg[(int) ret];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4845 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4846
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4847 /* Entry points compatible with 4.2 BSD regex library. We don't define
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4848 them if this is an Emacs or POSIX compilation. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4849
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4850 #if !defined (emacs) && !defined (_POSIX_SOURCE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4851
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4852 /* BSD has one and only one pattern buffer. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4853 static struct re_pattern_buffer re_comp_buf;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4854
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4855 char *
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4856 re_comp (s)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4857 const char *s;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4858 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4859 reg_errcode_t ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4860
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4861 if (!s)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4862 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4863 if (!re_comp_buf.buffer)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4864 return "No previous regular expression";
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4865 return 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4866 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4867
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4868 if (!re_comp_buf.buffer)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4869 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4870 re_comp_buf.buffer = (unsigned char *) malloc (200);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4871 if (re_comp_buf.buffer == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4872 return "Memory exhausted";
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4873 re_comp_buf.allocated = 200;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4874
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4875 re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4876 if (re_comp_buf.fastmap == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4877 return "Memory exhausted";
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4878 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4879
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4880 /* Since `re_exec' always passes NULL for the `regs' argument, we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4881 don't need to initialize the pattern buffer fields which affect it. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4882
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4883 /* Match anchors at newlines. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4884 re_comp_buf.newline_anchor = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4885
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4886 ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4887
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4888 /* Yes, we're discarding `const' here. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4889 return (char *) re_error_msg[(int) ret];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4890 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4891
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4892
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4893 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4894 re_exec (s)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4895 const char *s;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4896 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4897 const int len = strlen (s);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4898 return
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4899 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4900 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4901 #endif /* not emacs and not _POSIX_SOURCE */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4902
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4903 /* POSIX.2 functions. Don't define these for Emacs. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4904
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4905 #ifndef emacs
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4906
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4907 /* regcomp takes a regular expression as a string and compiles it.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4908
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4909 PREG is a regex_t *. We do not expect any fields to be initialized,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4910 since POSIX says we shouldn't. Thus, we set
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4911
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4912 `buffer' to the compiled pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4913 `used' to the length of the compiled pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4914 `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4915 REG_EXTENDED bit in CFLAGS is set; otherwise, to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4916 RE_SYNTAX_POSIX_BASIC;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4917 `newline_anchor' to REG_NEWLINE being set in CFLAGS;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4918 `fastmap' and `fastmap_accurate' to zero;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4919 `re_nsub' to the number of subexpressions in PATTERN.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4920
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4921 PATTERN is the address of the pattern string.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4922
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4923 CFLAGS is a series of bits which affect compilation.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4924
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4925 If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4926 use POSIX basic syntax.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4927
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4928 If REG_NEWLINE is set, then . and [^...] don't match newline.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4929 Also, regexec will try a match beginning after every newline.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4930
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4931 If REG_ICASE is set, then we considers upper- and lowercase
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4932 versions of letters to be equivalent when matching.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4933
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4934 If REG_NOSUB is set, then when PREG is passed to regexec, that
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4935 routine will report only success or failure, and nothing about the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4936 registers.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4937
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4938 It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4939 the return codes and their meanings.) */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4940
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4941 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4942 regcomp (preg, pattern, cflags)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4943 regex_t *preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4944 const char *pattern;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4945 int cflags;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4946 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4947 reg_errcode_t ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4948 unsigned syntax
1642
340feb030df1 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1641
diff changeset
4949 = (cflags & REG_EXTENDED) ?
340feb030df1 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1641
diff changeset
4950 RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4951
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4952 /* regex_compile will allocate the space for the compiled pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4953 preg->buffer = 0;
1642
340feb030df1 *** empty log message ***
David J. MacKenzie <djm@gnu.org>
parents: 1641
diff changeset
4954 preg->allocated = 0;
2758
ce6924085fc7 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2615
diff changeset
4955 preg->used = 0;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4956
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4957 /* Don't bother to use a fastmap when searching. This simplifies the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4958 REG_NEWLINE case: if we used a fastmap, we'd have to put all the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4959 characters after newlines into the fastmap. This way, we just try
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4960 every character. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4961 preg->fastmap = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4962
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4963 if (cflags & REG_ICASE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4964 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4965 unsigned i;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4966
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4967 preg->translate = (char *) malloc (CHAR_SET_SIZE);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4968 if (preg->translate == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4969 return (int) REG_ESPACE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4970
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4971 /* Map uppercase characters to corresponding lowercase ones. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4972 for (i = 0; i < CHAR_SET_SIZE; i++)
1668
46a583ec47a9 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1665
diff changeset
4973 preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4974 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4975 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4976 preg->translate = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4977
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4978 /* If REG_NEWLINE is set, newlines are treated differently. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4979 if (cflags & REG_NEWLINE)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4980 { /* REG_NEWLINE implies neither . nor [^...] match newline. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4981 syntax &= ~RE_DOT_NEWLINE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4982 syntax |= RE_HAT_LISTS_NOT_NEWLINE;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4983 /* It also changes the matching behavior. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4984 preg->newline_anchor = 1;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4985 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4986 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4987 preg->newline_anchor = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4988
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4989 preg->no_sub = !!(cflags & REG_NOSUB);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4990
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4991 /* POSIX says a null character in the pattern terminates it, so we
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4992 can use strlen here in compiling the pattern. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4993 ret = regex_compile (pattern, strlen (pattern), syntax, preg);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4994
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4995 /* POSIX doesn't distinguish between an unmatched open-group and an
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4996 unmatched close-group: both are REG_EPAREN. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4997 if (ret == REG_ERPAREN) ret = REG_EPAREN;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4998
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4999 return (int) ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5000 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5001
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5002
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5003 /* regexec searches for a given pattern, specified by PREG, in the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5004 string STRING.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5005
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5006 If NMATCH is zero or REG_NOSUB was set in the cflags argument to
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5007 `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5008 least NMATCH elements, and we set them to the offsets of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5009 corresponding matched substrings.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5010
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5011 EFLAGS specifies `execution flags' which affect matching: if
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5012 REG_NOTBOL is set, then ^ does not match at the beginning of the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5013 string; if REG_NOTEOL is set, then $ does not match at the end.
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5014
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5015 We return 0 if we find a match and REG_NOMATCH if not. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5016
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5017 int
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5018 regexec (preg, string, nmatch, pmatch, eflags)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5019 const regex_t *preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5020 const char *string;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5021 size_t nmatch;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5022 regmatch_t pmatch[];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5023 int eflags;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5024 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5025 int ret;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5026 struct re_registers regs;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5027 regex_t private_preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5028 int len = strlen (string);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5029 boolean want_reg_info = !preg->no_sub && nmatch > 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5030
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5031 private_preg = *preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5032
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5033 private_preg.not_bol = !!(eflags & REG_NOTBOL);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5034 private_preg.not_eol = !!(eflags & REG_NOTEOL);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5035
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5036 /* The user has told us exactly how many registers to return
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5037 information about, via `nmatch'. We have to pass that on to the
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5038 matching routines. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5039 private_preg.regs_allocated = REGS_FIXED;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5040
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5041 if (want_reg_info)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5042 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5043 regs.num_regs = nmatch;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5044 regs.start = TALLOC (nmatch, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5045 regs.end = TALLOC (nmatch, regoff_t);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5046 if (regs.start == NULL || regs.end == NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5047 return (int) REG_NOMATCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5048 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5049
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5050 /* Perform the searching operation. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5051 ret = re_search (&private_preg, string, len,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5052 /* start: */ 0, /* range: */ len,
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5053 want_reg_info ? &regs : (struct re_registers *) 0);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5054
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5055 /* Copy the register information to the POSIX structure. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5056 if (want_reg_info)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5057 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5058 if (ret >= 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5059 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5060 unsigned r;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5061
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5062 for (r = 0; r < nmatch; r++)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5063 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5064 pmatch[r].rm_so = regs.start[r];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5065 pmatch[r].rm_eo = regs.end[r];
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5066 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5067 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5068
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5069 /* If we needed the temporary register info, free the space now. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5070 free (regs.start);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5071 free (regs.end);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5072 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5073
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5074 /* We want zero return to mean success, unlike `re_search'. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5075 return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5076 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5077
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5078
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5079 /* Returns a message corresponding to an error code, ERRCODE, returned
1637
e81cb2cc709e *** empty log message ***
Karl Berry <karl@gnu.org>
parents: 1579
diff changeset
5080 from either regcomp or regexec. We don't use PREG here. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5081
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5082 size_t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5083 regerror (errcode, preg, errbuf, errbuf_size)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5084 int errcode;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5085 const regex_t *preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5086 char *errbuf;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5087 size_t errbuf_size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5088 {
1738
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5089 const char *msg;
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5090 size_t msg_size;
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5091
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5092 if (errcode < 0
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5093 || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0])))
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5094 /* Only error codes returned by the rest of the code should be passed
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5095 to this routine. If we are given anything else, or if other regex
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5096 code generates an invalid error code, then the program has a bug.
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5097 Dump core so we can fix it. */
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5098 abort ();
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5099
2453
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5100 msg = re_error_msg[errcode];
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5101
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5102 /* POSIX doesn't require that we do anything in this case, but why
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5103 not be nice. */
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5104 if (! msg)
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5105 msg = "Success";
944c0ecde8b1 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2078
diff changeset
5106
1738
4ec7bd2fbf55 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 1689
diff changeset
5107 msg_size = strlen (msg) + 1; /* Includes the null. */
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5108
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5109 if (errbuf_size != 0)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5110 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5111 if (msg_size > errbuf_size)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5112 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5113 strncpy (errbuf, msg, errbuf_size - 1);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5114 errbuf[errbuf_size - 1] = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5115 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5116 else
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5117 strcpy (errbuf, msg);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5118 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5119
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5120 return msg_size;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5121 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5122
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5123
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5124 /* Free dynamically allocated space used by PREG. */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5125
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5126 void
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5127 regfree (preg)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5128 regex_t *preg;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5129 {
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5130 if (preg->buffer != NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5131 free (preg->buffer);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5132 preg->buffer = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5133
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5134 preg->allocated = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5135 preg->used = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5136
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5137 if (preg->fastmap != NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5138 free (preg->fastmap);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5139 preg->fastmap = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5140 preg->fastmap_accurate = 0;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5141
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5142 if (preg->translate != NULL)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5143 free (preg->translate);
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5144 preg->translate = NULL;
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5145 }
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5146
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5147 #endif /* not emacs */
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5148
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5149 /*
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5150 Local variables:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5151 make-backup-files: t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5152 version-control: t
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5153 trim-versions-without-asking: nil
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5154 End:
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
5155 */