annotate Modules/regexpr.c @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents d6c7e40cbfdf
children d36250aefb82
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /*
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 regexpr.c
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 Author: Tatu Ylonen <ylo@ngs.fi>
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 Copyright (c) 1991 Tatu Ylonen, Espoo, Finland
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 Permission to use, copy, modify, distribute, and sell this software
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 and its documentation for any purpose is hereby granted without fee,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 provided that the above copyright notice appear in all copies. This
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 software is provided "as is" without express or implied warranty.
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 Created: Thu Sep 26 17:14:05 1991 ylo
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 Last modified: Mon Nov 4 17:06:48 1991 ylo
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
16 Ported to Think C: 19 Jan 1992 guido@cwi.nl
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 This code draws many ideas from the regular expression packages by
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 Henry Spencer of the University of Toronto and Richard Stallman of the
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 Free Software Foundation.
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 Emacs-specific code and syntax table code is almost directly borrowed
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 from GNU regexp.
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
3977
eaec4f6a8be8 Need config.h (for Win etc.)
Guido van Rossum <guido@python.org>
parents: 3596
diff changeset
27 #include "config.h" /* For Win* specific redefinition of printf c.s. */
eaec4f6a8be8 Need config.h (for Win etc.)
Guido van Rossum <guido@python.org>
parents: 3596
diff changeset
28
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 737
diff changeset
29 #include "myproto.h" /* For PROTO macro --Guido */
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
30
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #include <stdio.h>
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 #include <assert.h>
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #include "regexpr.h"
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
35 #ifdef THINK_C
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
36 /* Think C on the Mac really needs these headers... --Guido */
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
37 #include <stdlib.h>
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
38 #include <string.h>
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
39 #else
3596
8800df366b13 Subtle Windows changes
Guido van Rossum <guido@python.org>
parents: 1760
diff changeset
40 #if defined(__STDC__) || defined(_MSC_VER)
737
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
41 /* Don't mess around, use the standard headers */
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
42 #include <stdlib.h>
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
43 #include <string.h>
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
44 #else
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 char *malloc();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 void free();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 char *realloc();
737
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
48 #endif /* __STDC__ */
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
49 #endif /* THINK_C */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 #define MACRO_BEGIN do {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 #define MACRO_END } while (0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 enum regexp_compiled_ops /* opcodes for compiled regexp */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 Cend, /* end of pattern reached */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 Cbol, /* beginning of line */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 Ceol, /* end of line */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 Cset, /* character set. Followed by 32 bytes of set. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 Cexact, /* followed by a byte to match */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 Canychar, /* matches any character except newline */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 Cstart_memory, /* set register start addr (followed by reg number) */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 Cend_memory, /* set register end addr (followed by reg number) */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 Cmatch_memory, /* match a duplicate of reg contents (regnum follows)*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 Cjump, /* followed by two bytes (lsb,msb) of displacement. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 Cstar_jump, /* will change to jump/update_failure_jump at runtime */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 Cfailure_jump, /* jump to addr on failure */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 Cupdate_failure_jump, /* update topmost failure point and jump */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 Cdummy_failure_jump, /* push a dummy failure point and jump */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 Cbegbuf, /* match at beginning of buffer */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 Cendbuf, /* match at end of buffer */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 Cwordbeg, /* match at beginning of word */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 Cwordend, /* match at end of word */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 Cwordbound, /* match if at word boundary */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 Cnotwordbound, /* match if not at word boundary */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 Cemacs_at_dot, /* emacs only: matches at dot */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 Csyntaxspec, /* matches syntax code (1 byte follows) */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 Cnotsyntaxspec /* matches if syntax code does not match (1 byte foll)*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 };
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 enum regexp_syntax_op /* syntax codes for plain and quoted characters */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 Rend, /* special code for end of regexp */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 Rnormal, /* normal character */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 Ranychar, /* any character except newline */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 Rquote, /* the quote character */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 Rbol, /* match beginning of line */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 Reol, /* match end of line */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 Roptional, /* match preceding expression optionally */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 Rstar, /* match preceding expr zero or more times */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 Rplus, /* match preceding expr one or more times */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 Ror, /* match either of alternatives */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 Ropenpar, /* opening parenthesis */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 Rclosepar, /* closing parenthesis */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 Rmemory, /* match memory register */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 Rextended_memory, /* \vnn to match registers 10-99 */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 Ropenset, /* open set. Internal syntax hard-coded below. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 /* the following are gnu extensions to "normal" regexp syntax */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 Rbegbuf, /* beginning of buffer */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 Rendbuf, /* end of buffer */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 Rwordchar, /* word character */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 Rnotwordchar, /* not word character */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 Rwordbeg, /* beginning of word */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 Rwordend, /* end of word */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 Rwordbound, /* word bound */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 Rnotwordbound, /* not word bound */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 Remacs_at_dot, /* emacs: at dot */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 Remacs_syntaxspec, /* syntaxspec */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 Remacs_notsyntaxspec, /* notsyntaxspec */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 Rnum_ops
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 };
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 static int re_compile_initialized = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 static int regexp_syntax = 0;
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 737
diff changeset
119 int re_syntax = 0; /* Exported copy of regexp_syntax */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 static unsigned char regexp_plain_ops[256];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 static unsigned char regexp_quoted_ops[256];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 static unsigned char regexp_precedences[Rnum_ops];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 static int regexp_context_indep_ops;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 static int regexp_ansi_sequences;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 #define NUM_LEVELS 5 /* number of precedence levels in use */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 #define MAX_NESTING 100 /* max nesting level of operators */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 /* This code is for emacs compatibility only. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 #include "config.h"
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 #include "lisp.h"
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 #include "buffer.h"
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 #include "syntax.h"
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 /* emacs defines NULL in some strange way? */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 #undef NULL
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 #define NULL 0
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 #else /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 #define SYNTAX(ch) re_syntax_table[(unsigned char)(ch)]
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 #define Sword 1
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 #ifdef SYNTAX_TABLE
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 char *re_syntax_table;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 #else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 static char re_syntax_table[256];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 #endif /* SYNTAX_TABLE */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
155 static void re_compile_initialize PROTO((void));
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 static void re_compile_initialize()
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 int a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 #if !defined(emacs) && !defined(SYNTAX_TABLE)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 static int syntax_table_inited = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 if (!syntax_table_inited)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 syntax_table_inited = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 memset(re_syntax_table, 0, 256);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 for (a = 'a'; a <= 'z'; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 re_syntax_table[a] = Sword;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 for (a = 'A'; a <= 'Z'; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 re_syntax_table[a] = Sword;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 for (a = '0'; a <= '9'; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 re_syntax_table[a] = Sword;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 #endif /* !emacs && !SYNTAX_TABLE */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 re_compile_initialized = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 for (a = 0; a < 256; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 regexp_plain_ops[a] = Rnormal;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 regexp_quoted_ops[a] = Rnormal;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 for (a = '0'; a <= '9'; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 regexp_quoted_ops[a] = Rmemory;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 regexp_plain_ops['\134'] = Rquote;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 if (regexp_syntax & RE_NO_BK_PARENS)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 regexp_plain_ops['('] = Ropenpar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 regexp_plain_ops[')'] = Rclosepar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 regexp_quoted_ops['('] = Ropenpar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 regexp_quoted_ops[')'] = Rclosepar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 if (regexp_syntax & RE_NO_BK_VBAR)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 regexp_plain_ops['\174'] = Ror;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 regexp_quoted_ops['\174'] = Ror;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 regexp_plain_ops['*'] = Rstar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 if (regexp_syntax & RE_BK_PLUS_QM)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 regexp_quoted_ops['+'] = Rplus;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 regexp_quoted_ops['?'] = Roptional;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 regexp_plain_ops['+'] = Rplus;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 regexp_plain_ops['?'] = Roptional;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 if (regexp_syntax & RE_NEWLINE_OR)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 regexp_plain_ops['\n'] = Ror;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 regexp_plain_ops['\133'] = Ropenset;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 regexp_plain_ops['\136'] = Rbol;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 regexp_plain_ops['$'] = Reol;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 regexp_plain_ops['.'] = Ranychar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 if (!(regexp_syntax & RE_NO_GNU_EXTENSIONS))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 regexp_quoted_ops['='] = Remacs_at_dot;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 regexp_quoted_ops['s'] = Remacs_syntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 regexp_quoted_ops['S'] = Remacs_notsyntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 regexp_quoted_ops['w'] = Rwordchar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 regexp_quoted_ops['W'] = Rnotwordchar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 regexp_quoted_ops['<'] = Rwordbeg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 regexp_quoted_ops['>'] = Rwordend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 regexp_quoted_ops['b'] = Rwordbound;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 regexp_quoted_ops['B'] = Rnotwordbound;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 regexp_quoted_ops['`'] = Rbegbuf;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 regexp_quoted_ops['\''] = Rendbuf;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 if (regexp_syntax & RE_ANSI_HEX)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 regexp_quoted_ops['v'] = Rextended_memory;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 for (a = 0; a < Rnum_ops; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 regexp_precedences[a] = 4;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 if (regexp_syntax & RE_TIGHT_VBAR)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 regexp_precedences[Ror] = 3;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 regexp_precedences[Rbol] = 2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 regexp_precedences[Reol] = 2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 regexp_precedences[Ror] = 2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 regexp_precedences[Rbol] = 3;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 regexp_precedences[Reol] = 3;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 regexp_precedences[Rclosepar] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 regexp_precedences[Rend] = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 regexp_context_indep_ops = (regexp_syntax & RE_CONTEXT_INDEP_OPS) != 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 regexp_ansi_sequences = (regexp_syntax & RE_ANSI_HEX) != 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 int re_set_syntax(syntax)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 int syntax;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 int ret;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 ret = regexp_syntax;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 regexp_syntax = syntax;
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 737
diff changeset
260 re_syntax = syntax; /* Exported copy */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 re_compile_initialize();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 return ret;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
265 static int hex_char_to_decimal PROTO((int));
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 static int hex_char_to_decimal(ch)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 int ch;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 if (ch >= '0' && ch <= '9')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 return ch - '0';
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 if (ch >= 'a' && ch <= 'f')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 return ch - 'a' + 10;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 if (ch >= 'A' && ch <= 'F')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 return ch - 'A' + 10;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 return 16;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 char *re_compile_pattern(regex, size, bufp)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 char *regex;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 int size;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 int a, pos, op, current_level, level, opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 int pattern_offset, alloc;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 int starts[NUM_LEVELS * MAX_NESTING], starts_base;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 int future_jumps[MAX_NESTING], num_jumps;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 unsigned char ch;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 char *pattern, *translate;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 int next_register, paren_depth, num_open_registers, open_registers[RE_NREGS];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 int beginning_context;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 #define NEXTCHAR(var) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 if (pos >= size) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 goto ends_prematurely; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 (var) = regex[pos]; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 pos++; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 #define ALLOC(amount) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 if (pattern_offset+(amount) > alloc) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 { \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 alloc += 256 + (amount); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 pattern = realloc(pattern, alloc); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 if (!pattern) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 goto out_of_memory; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 } \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 #define STORE(ch) pattern[pattern_offset++] = (ch)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 #define CURRENT_LEVEL_START (starts[starts_base + current_level])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 #define SET_LEVEL_START starts[starts_base + current_level] = pattern_offset
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 #define PUSH_LEVEL_STARTS if (starts_base < (MAX_NESTING-1)*NUM_LEVELS) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 starts_base += NUM_LEVELS; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 else \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 goto too_complex
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 #define POP_LEVEL_STARTS starts_base -= NUM_LEVELS
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 #define PUT_ADDR(offset,addr) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 int disp = (addr) - (offset) - 2; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 pattern[(offset)] = disp & 0xff; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 pattern[(offset)+1] = (disp>>8) & 0xff; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 #define INSERT_JUMP(pos,type,addr) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 int a, p = (pos), t = (type), ad = (addr); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 for (a = pattern_offset - 1; a >= p; a--) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 pattern[a + 3] = pattern[a]; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 pattern[p] = t; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 PUT_ADDR(p+1,ad); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 pattern_offset += 3; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 #define SETBIT(buf,offset,bit) (buf)[(offset)+(bit)/8] |= (1<<((bit) & 7))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 #define SET_FIELDS \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 bufp->allocated = alloc; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 bufp->buffer = pattern; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 bufp->used = pattern_offset; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 #define GETHEX(var) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 char gethex_ch, gethex_value; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 NEXTCHAR(gethex_ch); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 gethex_value = hex_char_to_decimal(gethex_ch); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 if (gethex_value == 16) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 goto hex_error; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 NEXTCHAR(gethex_ch); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 gethex_ch = hex_char_to_decimal(gethex_ch); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 if (gethex_ch == 16) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 goto hex_error; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 (var) = gethex_value * 16 + gethex_ch; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 #define ANSI_TRANSLATE(ch) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 switch (ch) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 { \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 case 'a': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 case 'A': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 ch = 7; /* audible bell */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 case 'b': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 case 'B': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 ch = 8; /* backspace */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 case 'f': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 case 'F': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 ch = 12; /* form feed */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 case 'n': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 case 'N': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 ch = 10; /* line feed */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 case 'r': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 case 'R': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 ch = 13; /* carriage return */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 case 't': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 case 'T': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 ch = 9; /* tab */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 case 'v': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 case 'V': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 ch = 11; /* vertical tab */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 case 'x': /* hex code */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 case 'X': \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 GETHEX(ch); \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 default: \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 /* other characters passed through */ \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 if (translate) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 ch = translate[(unsigned char)ch]; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 break; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 } \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 if (!re_compile_initialized)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 re_compile_initialize();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 bufp->used = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 bufp->fastmap_accurate = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 bufp->uses_registers = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 translate = bufp->translate;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 pattern = bufp->buffer;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 alloc = bufp->allocated;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 if (alloc == 0 || pattern == NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 alloc = 256;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 pattern = malloc(alloc);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 if (!pattern)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 goto out_of_memory;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 pattern_offset = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 starts_base = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 num_jumps = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 current_level = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 num_open_registers = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 next_register = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 paren_depth = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 beginning_context = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 op = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 /* we use Rend dummy to ensure that pending jumps are updated (due to
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 low priority of Rend) before exiting the loop. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 pos = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 while (op != Rend)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 if (pos >= size)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 op = Rend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 op = regexp_plain_ops[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 if (op == Rquote)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 op = regexp_quoted_ops[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 if (op == Rnormal && regexp_ansi_sequences)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 ANSI_TRANSLATE(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 level = regexp_precedences[op];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 /* printf("ch='%c' op=%d level=%d current_level=%d curlevstart=%d\n",
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 ch, op, level, current_level, CURRENT_LEVEL_START); */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 if (level > current_level)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 for (current_level++; current_level < level; current_level++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 if (level < current_level)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 current_level = level;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 for (;num_jumps > 0 &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 future_jumps[num_jumps-1] >= CURRENT_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 num_jumps--)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 PUT_ADDR(future_jumps[num_jumps-1], pattern_offset);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 switch (op)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 case Rend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 case Rnormal:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 normal_char:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 opcode = Cexact;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 store_opcode_and_arg: /* opcode & ch must be set */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 ALLOC(2);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 STORE(opcode);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 STORE(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 case Ranychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 opcode = Canychar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 store_opcode:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 ALLOC(1);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 STORE(opcode);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 case Rquote:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 abort();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 /*NOTREACHED*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 case Rbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 if (!beginning_context)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 if (regexp_context_indep_ops)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 goto op_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 goto normal_char;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 opcode = Cbol;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 case Reol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 if (!((pos >= size) ||
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 ((regexp_syntax & RE_NO_BK_VBAR) ?
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 (regex[pos] == '\174') :
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 (pos+1 < size && regex[pos] == '\134' &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 regex[pos+1] == '\174')) ||
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 ((regexp_syntax & RE_NO_BK_PARENS)?
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 (regex[pos] == ')'):
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 (pos+1 < size && regex[pos] == '\134' &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 regex[pos+1] == ')'))))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 if (regexp_context_indep_ops)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 goto op_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 goto normal_char;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 opcode = Ceol;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518 goto store_opcode;
737
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
519 /* NOTREACHED */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
520 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 case Roptional:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 if (beginning_context)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 if (regexp_context_indep_ops)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 goto op_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526 goto normal_char;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 if (CURRENT_LEVEL_START == pattern_offset)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 break; /* ignore empty patterns for ? */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
529 ALLOC(3);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 pattern_offset + 3);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 case Rstar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 case Rplus:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 if (beginning_context)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 if (regexp_context_indep_ops)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 goto op_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 goto normal_char;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 if (CURRENT_LEVEL_START == pattern_offset)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
541 break; /* ignore empty patterns for + and * */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542 ALLOC(9);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
544 pattern_offset + 6);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 INSERT_JUMP(pattern_offset, Cstar_jump, CURRENT_LEVEL_START);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 if (op == Rplus) /* jump over initial failure_jump */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 INSERT_JUMP(CURRENT_LEVEL_START, Cdummy_failure_jump,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 CURRENT_LEVEL_START + 6);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 case Ror:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 ALLOC(6);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 pattern_offset + 6);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 if (num_jumps >= MAX_NESTING)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 goto too_complex;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 STORE(Cjump);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 future_jumps[num_jumps++] = pattern_offset;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 STORE(0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 STORE(0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 case Ropenpar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
564 if (next_register < RE_NREGS)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 bufp->uses_registers = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
567 ALLOC(2);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 STORE(Cstart_memory);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
569 STORE(next_register);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 open_registers[num_open_registers++] = next_register;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
571 next_register++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 paren_depth++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 PUSH_LEVEL_STARTS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 current_level = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
576 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 case Rclosepar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 if (paren_depth <= 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 goto parenthesis_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 POP_LEVEL_STARTS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 current_level = regexp_precedences[Ropenpar];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 paren_depth--;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 if (paren_depth < num_open_registers)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
585 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 bufp->uses_registers = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 ALLOC(2);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 STORE(Cend_memory);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
589 num_open_registers--;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 STORE(open_registers[num_open_registers]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
592 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 case Rmemory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 if (ch == '0')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 goto bad_match_register;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 assert(ch >= '0' && ch <= '9');
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 bufp->uses_registers = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 opcode = Cmatch_memory;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 ch -= '0';
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 case Rextended_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 if (ch < '0' || ch > '9')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 goto bad_match_register;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 NEXTCHAR(a);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 if (a < '0' || a > '9')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 goto bad_match_register;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 ch = 10 * (a - '0') + ch - '0';
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 if (ch <= 0 || ch >= RE_NREGS)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 goto bad_match_register;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 bufp->uses_registers = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 opcode = Cmatch_memory;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 case Ropenset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 int complement,prev,offset,range,firstchar;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
617
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 SET_LEVEL_START;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 ALLOC(1+256/8);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
620 STORE(Cset);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 offset = pattern_offset;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 for (a = 0; a < 256/8; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623 STORE(0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
627 if (ch == '\136')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629 complement = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
632 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635 complement = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 prev = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 range = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 firstchar = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639 while (ch != '\135' || firstchar)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 firstchar = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 if (regexp_ansi_sequences && ch == '\134')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 ANSI_TRANSLATE(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 if (range)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 {
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 737
diff changeset
649 for (a = prev; a <= (int)ch; a++)
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
650 SETBIT(pattern, offset, a);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 prev = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 range = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 if (prev != -1 && ch == '-')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 range = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 SETBIT(pattern, offset, ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 prev = ch;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
661 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 if (range)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 SETBIT(pattern, offset, '-');
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
668 if (complement)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
669 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 for (a = 0; a < 256/8; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 pattern[offset+a] ^= 0xff;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
672 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
675 case Rbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
676 opcode = Cbegbuf;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 case Rendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 opcode = Cendbuf;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 case Rwordchar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 opcode = Csyntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 ch = Sword;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 case Rnotwordchar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 opcode = Cnotsyntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 ch = Sword;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
689 case Rwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 opcode = Cwordbeg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 case Rwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
693 opcode = Cwordend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 case Rwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 opcode = Cwordbound;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
697 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 case Rnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 opcode = Cnotwordbound;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
701 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
702 case Remacs_at_dot:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
703 opcode = Cemacs_at_dot;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
704 goto store_opcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
705 case Remacs_syntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
706 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
707 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
708 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 opcode = Csyntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
710 ch = syntax_spec_code[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
711 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
712 case Remacs_notsyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
713 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
715 ch = translate[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
716 opcode = Cnotsyntaxspec;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
717 ch = syntax_spec_code[(unsigned char)ch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
718 goto store_opcode_and_arg;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
719 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
721 abort();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
722 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723 beginning_context = (op == Ropenpar || op == Ror);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
725 if (starts_base != 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 goto parenthesis_error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 assert(num_jumps == 0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 ALLOC(1);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 STORE(Cend);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 return NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
732
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
733 op_error:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
735 return "Badly placed special character";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
736
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737 bad_match_register:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
738 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 return "Bad match register number";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
740
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
741 hex_error:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
743 return "Bad hexadecimal number";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 parenthesis_error:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
746 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 return "Badly placed parenthesis";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
748
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
749 out_of_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
750 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751 return "Out of memory";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
752
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 ends_prematurely:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
755 return "Regular expression ends prematurely";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
756
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 too_complex:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 SET_FIELDS;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 return "Regular expression too complex";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
760 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 #undef CHARAT
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
762 #undef NEXTCHAR
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
763 #undef GETHEX
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
764 #undef ALLOC
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 #undef STORE
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
766 #undef CURRENT_LEVEL_START
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 #undef SET_LEVEL_START
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
768 #undef PUSH_LEVEL_STARTS
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 #undef POP_LEVEL_STARTS
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
770 #undef PUT_ADDR
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
771 #undef INSERT_JUMP
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
772 #undef SETBIT
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 #undef SET_FIELDS
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
775 static void re_compile_fastmap_aux
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
776 PROTO((char *, int, char *, char *, char *));
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
777 static void re_compile_fastmap_aux(code, pos, visited, can_be_null, fastmap)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
778 char *code, *visited, *can_be_null, *fastmap;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
779 int pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
780 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 int a, b, syntaxcode;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
782
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 if (visited[pos])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
784 return; /* we have already been here */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
785 visited[pos] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
786 for (;;)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 switch (code[pos++])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
788 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
789 case Cend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
790 *can_be_null = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
791 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
792 case Cbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 case Cbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 case Cendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 case Cwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 case Cwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 case Cwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 case Cnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
799 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
800 case Cemacs_at_dot:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
802 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
803 case Csyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
804 syntaxcode = code[pos++];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 for (a = 0; a < 256; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
806 if (SYNTAX(a) == syntaxcode)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
807 fastmap[a] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
808 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 case Cnotsyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
810 syntaxcode = code[pos++];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
811 for (a = 0; a < 256; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 if (SYNTAX(a) != syntaxcode)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 fastmap[a] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
814 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 case Ceol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
816 fastmap['\n'] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 if (*can_be_null == 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 *can_be_null = 2; /* can match null, but only at end of buffer*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
820 case Cset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 for (a = 0; a < 256/8; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
822 if (code[pos + a] != 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
823 for (b = 0; b < 8; b++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 if (code[pos + a] & (1 << b))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
825 fastmap[(a << 3) + b] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 pos += 256/8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
827 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
828 case Cexact:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 fastmap[(unsigned char)code[pos]] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
830 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 case Canychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
832 for (a = 0; a < 256; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
833 if (a != '\n')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
834 fastmap[a] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
835 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 case Cstart_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
837 case Cend_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 pos++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
840 case Cmatch_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 /* should this ever happen for sensible patterns??? */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 *can_be_null = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
844 case Cjump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
845 case Cdummy_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 case Cupdate_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 case Cstar_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 a = (unsigned char)code[pos++];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 a |= (unsigned char)code[pos++] << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 pos += (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 if (visited[pos])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 /* argh... the regexp contains empty loops. This is not
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 good, as this may cause a failure stack overflow when
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 matching. Oh well. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 /* this path leads nowhere; pursue other paths. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 visited[pos] = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 case Cfailure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 a = (unsigned char)code[pos++];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 a |= (unsigned char)code[pos++] << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 a = pos + (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 re_compile_fastmap_aux(code, a, visited, can_be_null, fastmap);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 abort(); /* probably some opcode is missing from this switch */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 /*NOTREACHED*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
870 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
872
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
873 static int re_do_compile_fastmap PROTO((char *, int, int, char *, char *));
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
874 static int re_do_compile_fastmap(buffer, used, pos, can_be_null, fastmap)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 char *buffer, *fastmap, *can_be_null;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 int used, pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 char small_visited[512], *visited;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
879
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 if (used <= sizeof(small_visited))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
881 visited = small_visited;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 visited = malloc(used);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
885 if (!visited)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 return 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 *can_be_null = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
889 memset(fastmap, 0, 256);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
890 memset(visited, 0, used);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 re_compile_fastmap_aux(buffer, pos, visited, can_be_null, fastmap);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 if (visited != small_visited)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
893 free(visited);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
894 return 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
895 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
896
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 void re_compile_fastmap(bufp)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
899 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
900 if (!bufp->fastmap || bufp->fastmap_accurate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
901 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
902 assert(bufp->used > 0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 if (!re_do_compile_fastmap(bufp->buffer, bufp->used, 0, &bufp->can_be_null,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 bufp->fastmap))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 return;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 if (bufp->buffer[0] == Cbol)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 bufp->anchor = 1; /* begline */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
908 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 if (bufp->buffer[0] == Cbegbuf)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 bufp->anchor = 2; /* begbuf */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
911 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 bufp->anchor = 0; /* none */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 bufp->fastmap_accurate = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
915
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
916 #define INITIAL_FAILURES 128 /* initial # failure points to allocate */
3596
8800df366b13 Subtle Windows changes
Guido van Rossum <guido@python.org>
parents: 1760
diff changeset
917 #define MAX_FAILURES 4100L /* max # of failure points before failing */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
918
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
919 int re_match_2(bufp, string1, size1, string2, size2, pos, regs, mstop)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
921 char *string1, *string2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
922 int size1, size2, pos, mstop;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 regexp_registers_t regs;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
925 struct failure_point { char *text, *partend, *code; }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
926 *failure_stack_start, *failure_sp, *failure_stack_end,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
927 initial_failure_stack[INITIAL_FAILURES];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
928 char *code, *translate, *text, *textend, *partend, *part_2_end;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
929 char *regstart_text[RE_NREGS], *regstart_partend[RE_NREGS];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
930 char *regend_text[RE_NREGS], *regend_partend[RE_NREGS];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
931 int a, b, ch, reg, regch, match_end;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
932 char *regtext, *regpartend, *regtextend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
933
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
934 #define PREFETCH \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
935 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
936 if (text == partend) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 { \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
938 if (text == textend) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
939 goto fail; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
940 text = string2; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
941 partend = part_2_end; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
942 } \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
943 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
944
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
945 #define NEXTCHAR(var) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
946 MACRO_BEGIN \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
947 PREFETCH; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
948 (var) = (unsigned char)*text++; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
949 if (translate) \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 (var) = (unsigned char)translate[(var)]; \
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 MACRO_END
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
952
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
953 assert(pos >= 0 && size1 >= 0 && size2 >= 0 && mstop >= 0);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
954 assert(mstop <= size1 + size2);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
955 assert(pos <= mstop);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
957 if (pos <= size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
958 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
959 text = string1 + pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
960 if (mstop <= size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
961 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 partend = string1 + mstop;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
963 textend = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
964 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
965 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
966 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
967 partend = string1 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
968 textend = string2 + mstop - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
970 part_2_end = string2 + mstop - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
971 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
972 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 text = string2 + pos - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 partend = string2 + mstop - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 textend = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 part_2_end = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 if (bufp->uses_registers && regs != NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
981 for (a = 0; a < RE_NREGS; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
982 regend_text[a] = NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
983
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 code = bufp->buffer;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 translate = bufp->translate;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 failure_stack_start = failure_sp = initial_failure_stack;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
987 failure_stack_end = initial_failure_stack + INITIAL_FAILURES;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
988
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
989 #if 0
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 /* re_search_2 has already done this, and otherwise we get little benefit
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
991 from this. So I'll leave this out. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
992 if (bufp->fastmap_accurate && !bufp->can_be_null &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
993 text != textend &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
994 !bufp->fastmap[translate ?
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
995 (unsigned char)translate[(unsigned char)*text] :
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 (unsigned char)*text])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
997 return -1; /* it can't possibly match */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
998 #endif
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
999
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1000 continue_matching:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1001 for (;;)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 switch (*code++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005 case Cend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006 if (partend != part_2_end)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1007 match_end = text - string1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009 match_end = text - string2 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1010 if (regs)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1011 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 regs->start[0] = pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013 regs->end[0] = match_end;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1014 if (!bufp->uses_registers)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1016 for (a = 1; a < RE_NREGS; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 regs->start[a] = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 regs->end[a] = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1022 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1024 for (a = 1; a < RE_NREGS; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026 if (regend_text[a] == NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028 regs->start[a] = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 regs->end[a] = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1030 continue;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1032 if (regstart_partend[a] != part_2_end)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1033 regs->start[a] = regstart_text[a] - string1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1034 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 regs->start[a] = regstart_text[a] - string2 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036 if (regend_partend[a] != part_2_end)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1037 regs->end[a] = regend_text[a] - string1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1038 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1039 regs->end[a] = regend_text[a] - string2 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1040 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1041 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1042 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1043 if (failure_stack_start != initial_failure_stack)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044 free((char *)failure_stack_start);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045 return match_end - pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1046 case Cbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1047 if (text == string1 || text[-1] == '\n') /* text[-1] always valid */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1048 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1049 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1050 case Ceol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051 if (text == string2 + size2 ||
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052 (text == string1 + size1 ?
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1053 (size2 == 0 || *string2 == '\n') :
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1054 *text == '\n'))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1055 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1056 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 case Cset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1059 if (code[ch/8] & (1<<(ch & 7)))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1060 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1061 code += 256/8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1064 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1065 case Cexact:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1066 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1067 if (ch != (unsigned char)*code++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1070 case Canychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 if (ch == '\n')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075 case Cstart_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1076 reg = *code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1077 regstart_text[reg] = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1078 regstart_partend[reg] = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 case Cend_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081 reg = *code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1082 regend_text[reg] = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1083 regend_partend[reg] = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085 case Cmatch_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1086 reg = *code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 if (regend_text[reg] == NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 goto fail; /* or should we just match nothing? */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 regtext = regstart_text[reg];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 regtextend = regend_text[reg];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 if (regstart_partend[reg] == regend_partend[reg])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 regpartend = regtextend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1093 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1094 regpartend = string1 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1095
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1096 for (;regtext != regtextend;)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099 if (regtext == regpartend)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1100 regtext = string2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1101 regch = (unsigned char)*regtext++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 regch = (unsigned char)translate[regch];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 if (regch != ch)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 case Cstar_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109 /* star is coded as:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110 1: failure_jump 2
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 ... code for operand of star
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112 star_jump 1
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1113 2: ... code after star
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1114 We change the star_jump to update_failure_jump if we can determine
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1115 that it is safe to do so; otherwise we change it to an ordinary
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 jump.
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1117 plus is coded as
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1118 jump 2
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 1: failure_jump 3
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120 2: ... code for operand of plus
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121 star_jump 1
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122 3: ... code after plus
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1123 For star_jump considerations this is processed identically
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124 to star. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 a = (unsigned char)*code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126 a |= (unsigned char)*code++ << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 a = (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1129 char map[256], can_be_null;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130 char *p1, *p2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1132 p1 = code + a + 3; /* skip the failure_jump */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1133 assert(p1[-3] == Cfailure_jump);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1134 p2 = code;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1135 /* p1 points inside loop, p2 points to after loop */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1136 if (!re_do_compile_fastmap(bufp->buffer, bufp->used,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1137 p2 - bufp->buffer, &can_be_null, map))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 /* If we might introduce a new update point inside the loop,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140 we can't optimize because then update_jump would update a
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1141 wrong failure point. Thus we have to be quite careful here. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1142 loop_p1:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 /* loop until we find something that consumes a character */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 switch (*p1++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1146 case Cbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 case Ceol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148 case Cbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149 case Cendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 case Cwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151 case Cwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152 case Cwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1153 case Cnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1154 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1155 case Cemacs_at_dot:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1156 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1157 goto loop_p1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1158 case Cstart_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1159 case Cend_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1160 p1++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1161 goto loop_p1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 case Cexact:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1163 ch = (unsigned char)*p1++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 if (map[ch])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1166 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1167 case Canychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1168 for (b = 0; b < 256; b++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1169 if (b != '\n' && map[b])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1170 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1171 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172 case Cset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1173 for (b = 0; b < 256; b++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1174 if ((p1[b >> 3] & (1 << (b & 7))) && map[b])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1176 p1 += 256/8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1177 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1178 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1179 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1180 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181 /* now we know that we can't backtrack. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 while (p1 != p2 - 3)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1183 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 switch (*p1++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1185 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1186 case Cend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1187 abort(); /* we certainly shouldn't get this inside loop */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1188 /*NOTREACHED*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1189 case Cbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1190 case Ceol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1191 case Canychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 case Cbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193 case Cendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 case Cwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 case Cwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 case Cwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1197 case Cnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1199 case Cemacs_at_dot:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1200 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1202 case Cset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1203 p1 += 256/8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1204 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1205 case Cexact:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1206 case Cstart_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1207 case Cend_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1208 case Cmatch_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1209 case Csyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1210 case Cnotsyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1211 p1++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1212 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1213 case Cjump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1214 case Cstar_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1215 case Cfailure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1216 case Cupdate_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1217 case Cdummy_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1218 goto make_normal_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1219 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1220 printf("regexpr.c: processing star_jump: unknown op %d\n", p1[-1]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1221 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1222 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1223 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1224 goto make_update_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1225 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1226 make_normal_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1227 /* printf("changing to normal jump\n"); */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1228 code -= 3;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1229 *code = Cjump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1230 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1231 make_update_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1232 /* printf("changing to update jump\n"); */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1233 code -= 2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1234 a += 3; /* jump to after the Cfailure_jump */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1235 code[-1] = Cupdate_failure_jump;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1236 code[0] = a & 0xff;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1237 code[1] = a >> 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1238 /* fall to next case */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1239 case Cupdate_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1240 failure_sp[-1].text = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1241 failure_sp[-1].partend = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1242 /* fall to next case */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1243 case Cjump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1244 a = (unsigned char)*code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1245 a |= (unsigned char)*code++ << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1246 code += (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1247 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1248 case Cdummy_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1249 case Cfailure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250 if (failure_sp == failure_stack_end)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1251 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252 if (failure_stack_start != initial_failure_stack)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1253 goto error;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1254 failure_stack_start = (struct failure_point *)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1255 malloc(MAX_FAILURES * sizeof(*failure_stack_start));
1760
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1256 if (failure_stack_start == NULL)
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1257 {
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1258 failure_stack_start = initial_failure_stack;
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1259 goto error;
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1260 }
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1261 failure_stack_end = failure_stack_start + MAX_FAILURES;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1262 memcpy((char *)failure_stack_start, (char *)initial_failure_stack,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1263 INITIAL_FAILURES * sizeof(*failure_stack_start));
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1264 failure_sp = failure_stack_start + INITIAL_FAILURES;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1265 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1266 a = (unsigned char)*code++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1267 a |= (unsigned char)*code++ << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1268 a = (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1269 if (code[-3] == Cdummy_failure_jump)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1270 { /* this is only used in plus */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1271 assert(*code == Cfailure_jump);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1272 b = (unsigned char)code[1];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1273 b |= (unsigned char)code[2] << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1274 failure_sp->code = code + (int)(short)b + 3;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1275 failure_sp->text = NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1276 code += a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1277 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1278 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1279 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1280 failure_sp->code = code + a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1281 failure_sp->text = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1282 failure_sp->partend = partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1283 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1284 failure_sp++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1285 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1286 case Cbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1287 if (text == string1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1288 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1289 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1290 case Cendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1291 if (size2 == 0 ? text == string1 + size1 : text == string2 + size2)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1292 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1293 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1294 case Cwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1295 if (text == string2 + size2)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1296 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297 if (size2 == 0 && text == string1 + size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1298 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1299 if (SYNTAX(text == string1 + size1 ? *string1 : *text) != Sword)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1300 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301 if (text == string1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1302 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1303 if (SYNTAX(text[-1]) != Sword)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1304 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1305 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1306 case Cwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1307 if (text == string1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1308 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1309 if (SYNTAX(text[-1]) != Sword)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1310 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1311 if (text == string2 + size2)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1312 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1313 if (size2 == 0 && text == string1 + size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1314 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315 if (SYNTAX(*text) == Sword)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1316 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1317 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318 case Cwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1319 /* Note: as in gnu regexp, this also matches at the beginning
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1320 and end of buffer. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1321 if (text == string1 || text == string2 + size2 ||
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1322 (size2 == 0 && text == string1 + size1))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1323 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1324 if ((SYNTAX(text[-1]) == Sword) ^
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1325 (SYNTAX(text == string1 + size1 ? *string2 : *text) == Sword))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1327 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1328 case Cnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1329 /* Note: as in gnu regexp, this never matches at the beginning
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1330 and end of buffer. */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1331 if (text == string1 || text == string2 + size2 ||
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1332 (size2 == 0 && text == string1 + size1))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334 if (!((SYNTAX(text[-1]) == Sword) ^
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1335 (SYNTAX(text == string1 + size1 ? *string2 : *text) == Sword)))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 case Csyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1339 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340 if (SYNTAX(ch) != (unsigned char)*code++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1341 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1342 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1343 case Cnotsyntaxspec:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1344 NEXTCHAR(ch);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1345 if (SYNTAX(ch) != (unsigned char)*code++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1346 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1348 #ifdef emacs
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1349 case Cemacs_at_dot:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1350 if (PTR_CHAR_POS((unsigned char *)text) + 1 != point)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1351 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1352 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1353 #endif /* emacs */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1354 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1355 abort();
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1356 /*NOTREACHED*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1357 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358 }
638
9d01e98ed849 Ported to THINK C.
Guido van Rossum <guido@python.org>
parents: 634
diff changeset
1359 #if 0 /* This line is never reached --Guido */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1360 abort();
619
ac7d64453aa9 #ifdef'ed an unreachable line out.
Guido van Rossum <guido@python.org>
parents: 616
diff changeset
1361 #endif
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362 /*NOTREACHED*/
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364 fail:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1365 if (failure_sp != failure_stack_start)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1366 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1367 failure_sp--;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1368 text = failure_sp->text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1369 if (text == NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370 goto fail;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 partend = failure_sp->partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372 code = failure_sp->code;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1373 goto continue_matching;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375 if (failure_stack_start != initial_failure_stack)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1376 free((char *)failure_stack_start);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1377 return -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379 error:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380 if (failure_stack_start != initial_failure_stack)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 free((char *)failure_stack_start);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 return -2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1384
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1385 #undef PREFETCH
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1386 #undef NEXTCHAR
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387 #undef PUSH_FAILURE
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1389 int re_match(bufp, string, size, pos, regs)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391 char *string;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1392 int size, pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393 regexp_registers_t regs;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1394 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1395 return re_match_2(bufp, string, size, (char *)NULL, 0, pos, regs, size);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1397
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398 int re_search_2(bufp, string1, size1, string2, size2, pos, range, regs,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1399 mstop)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1400 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1401 char *string1, *string2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1402 int size1, size2, pos, range, mstop;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1403 regexp_registers_t regs;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1404 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1405 char *fastmap, *translate, *text, *partstart, *partend;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1406 int dir, ret;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 char anchor;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1409 assert(size1 >= 0 && size2 >= 0 && pos >= 0 && mstop >= 0);
634
885996a1a631 Retract the rage bugfix, but change the range assertion.
Guido van Rossum <guido@python.org>
parents: 619
diff changeset
1410 assert(pos + range >= 0 && pos + range <= size1 + size2); /* Bugfix by ylo */
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1411 assert(pos <= mstop);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1413 fastmap = bufp->fastmap;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1414 translate = bufp->translate;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1415 if (fastmap && !bufp->fastmap_accurate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1416 re_compile_fastmap(bufp);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1417 anchor = bufp->anchor;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1418 if (bufp->can_be_null == 1) /* can_be_null == 2: can match null at eob */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1419 fastmap = NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1420 if (range < 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1421 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1422 dir = -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1423 range = -range;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1424 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1425 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1426 dir = 1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1427 if (anchor == 2)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1428 if (pos != 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1429 return -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1430 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1431 range = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1432 for (; range >= 0; range--, pos += dir)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1433 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1434 if (fastmap)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1435 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1436 if (dir == 1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1437 { /* searching forwards */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1438 if (pos < size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1439 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1440 text = string1 + pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1441 if (pos + range > size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1442 partend = string1 + size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1443 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1444 partend = string1 + pos + range;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1445 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1446 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1447 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1448 text = string2 + pos - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1449 partend = string2 + pos + range - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1450 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1451 partstart = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1452 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1453 while (text != partend &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1454 !fastmap[(unsigned char)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1455 translate[(unsigned char)*text]])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456 text++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1457 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1458 while (text != partend && !fastmap[(unsigned char)*text])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1459 text++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1460 pos += text - partstart;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1461 range -= text - partstart;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1462 if (pos == size1 + size2 && bufp->can_be_null == 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1463 return -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1464 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1465 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1466 { /* searching backwards */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1467 if (pos <= size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1468 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1469 text = string1 + pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1470 partstart = string1 + pos - range;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1471 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1472 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1473 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1474 text = string2 + pos - size1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1475 if (range < pos - size1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1476 partstart = string2 + pos - size1 - range;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1477 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1478 partstart = string2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1479 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1480 partend = text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1481 if (translate)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1482 while (text != partstart &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1483 !fastmap[(unsigned char)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1484 translate[(unsigned char)*text]])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1485 text--;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1486 else
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1487 while (text != partstart &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1488 !fastmap[(unsigned char)*text])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489 text--;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1490 pos -= partend - text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1491 range -= partend - text;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1492 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1493 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1494 if (anchor == 1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495 { /* anchored to begline */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1496 if (pos > 0 &&
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1497 (pos <= size1 ? string1[pos - 1] :
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498 string2[pos - size1 - 1]) != '\n')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1499 continue;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1500 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1501 assert(pos >= 0 && pos <= size1 + size2);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1502 ret = re_match_2(bufp, string1, size1, string2, size2, pos, regs, mstop);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1503 if (ret >= 0)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 return pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1505 if (ret == -2)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1506 return -2;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1507 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508 return -1;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1509 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1510
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1511 int re_search(bufp, string, size, startpos, range, regs)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1512 regexp_t bufp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1513 char *string;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1514 int size, startpos, range;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1515 regexp_registers_t regs;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1516 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1517 return re_search_2(bufp, string, size, (char *)NULL, 0,
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1518 startpos, range, regs, size);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1519 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1520
737
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
1521 #ifdef UNUSED
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
1522
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523 static struct re_pattern_buffer re_comp_buf;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1524
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1525 char *re_comp(s)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1526 char *s;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1527 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1528 if (s == NULL)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1529 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1530 if (!re_comp_buf.buffer)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1531 return "Out of memory";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1532 return NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1533 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1534 if (!re_comp_buf.buffer)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1535 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1536 /* the buffer will be allocated automatically */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1537 re_comp_buf.fastmap = malloc(256);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1538 re_comp_buf.translate = NULL;
1760
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1539 if (re_comp_buf.fastmap == NULL)
48e6b319f3e4 * Modules/{Setup.in,Makefile.pre.in}: renamed some modules to
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
1540 return "Out of memory";
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1541 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1542 return re_compile_pattern(s, strlen(s), &re_comp_buf);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1543 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1544
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1545 int re_exec(s)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1546 char *s;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1548 int len = strlen(s);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1550 return re_search(&re_comp_buf, s, len, 0, len, (regexp_registers_t)NULL) >= 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1551 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1552
737
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
1553 #endif
8246576ef3f5 Lint fluff
Guido van Rossum <guido@python.org>
parents: 638
diff changeset
1554
616
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1555 #ifdef TEST_REGEXP
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1556
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557 int main()
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1558 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1559 char buf[500];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1560 char *cp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1561 struct re_pattern_buffer exp;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1562 struct re_registers regs;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1563 int a,pos;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1564 char fastmap[256];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1565
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1566 exp.allocated = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1567 exp.buffer = 0;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1568 exp.translate = NULL;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1569 exp.fastmap = fastmap;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1570
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1571 /* re_set_syntax(RE_NO_BK_PARENS|RE_NO_BK_VBAR|RE_ANSI_HEX); */
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1572
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1573 while (1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1574 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1575 printf("Enter regexp:\n");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1576 gets(buf);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1577 cp=re_compile_pattern(buf, strlen(buf), &exp);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1578 if (cp)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1579 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1580 printf("Error: %s\n", cp);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1581 continue;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1582 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1583 re_compile_fastmap(&exp);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1584 printf("dump:\n");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1585 for (pos = 0; pos < exp.used;)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1586 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1587 printf("%d: ", pos);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1588 switch (exp.buffer[pos++])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1589 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1590 case Cend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1591 strcpy(buf, "end");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1592 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1593 case Cbol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1594 strcpy(buf, "bol");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1595 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1596 case Ceol:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1597 strcpy(buf, "eol");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1598 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1599 case Cset:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1600 strcpy(buf, "set ");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1601 for (a = 0; a < 256/8; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1602 sprintf(buf+strlen(buf)," %02x",
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1603 (unsigned char)exp.buffer[pos++]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1604 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1605 case Cexact:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1606 sprintf(buf, "exact '%c' 0x%x", exp.buffer[pos],
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1607 (unsigned char)exp.buffer[pos]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1608 pos++;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1609 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1610 case Canychar:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1611 strcpy(buf, "anychar");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1613 case Cstart_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1614 sprintf(buf, "start_memory %d", exp.buffer[pos++]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1615 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1616 case Cend_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1617 sprintf(buf, "end_memory %d", exp.buffer[pos++]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1618 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1619 case Cmatch_memory:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1620 sprintf(buf, "match_memory %d", exp.buffer[pos++]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1621 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1622 case Cjump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1623 case Cdummy_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1624 case Cstar_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1625 case Cfailure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1626 case Cupdate_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1627 a = (unsigned char)exp.buffer[pos++];
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1628 a += (unsigned char)exp.buffer[pos++] << 8;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1629 a = (int)(short)a;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1630 switch (exp.buffer[pos-3])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1631 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1632 case Cjump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1633 cp = "jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1634 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1635 case Cstar_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1636 cp = "star_jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1637 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1638 case Cfailure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1639 cp = "failure_jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1640 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1641 case Cupdate_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1642 cp = "update_failure_jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1643 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1644 case Cdummy_failure_jump:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1645 cp = "dummy_failure_jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1646 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1647 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1648 cp = "unknown jump";
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1649 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1650 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1651 sprintf(buf, "%s %d", cp, a + pos);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1652 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1653 case Cbegbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1654 strcpy(buf,"begbuf");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1655 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1656 case Cendbuf:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1657 strcpy(buf,"endbuf");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1658 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1659 case Cwordbeg:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1660 strcpy(buf,"wordbeg");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1661 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1662 case Cwordend:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1663 strcpy(buf,"wordend");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1664 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1665 case Cwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1666 strcpy(buf,"wordbound");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1667 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1668 case Cnotwordbound:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1669 strcpy(buf,"notwordbound");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1670 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1671 default:
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1672 sprintf(buf, "unknown code %d",
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1673 (unsigned char)exp.buffer[pos - 1]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1674 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1675 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1676 printf("%s\n", buf);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1677 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1678 printf("can_be_null = %d uses_registers = %d anchor = %d\n",
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1679 exp.can_be_null, exp.uses_registers, exp.anchor);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1680
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1681 printf("fastmap:");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1682 for (a = 0; a < 256; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1683 if (exp.fastmap[a])
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1684 printf(" %d", a);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1685 printf("\n");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1686 printf("Enter strings. An empty line terminates.\n");
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1687 while (fgets(buf, sizeof(buf), stdin))
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1688 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1689 if (buf[0] == '\n')
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1690 break;
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1691 a = re_search(&exp, buf, strlen(buf), 0, strlen(buf), &regs);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1692 printf("search returns %d\n", a);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1693 if (a != -1)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1694 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1695 for (a = 0; a < RE_NREGS; a++)
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1696 {
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1697 printf("buf %d: %d to %d\n", a, regs.start[a], regs.end[a]);
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1698 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1699 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1700 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1701 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1702 }
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1703
8d5725494ede Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1704 #endif /* TEST_REGEXP */