Mercurial > cpython-lru_cache-weakref
annotate Modules/_sre.c @ 58925:eecf1bef052d 2.6
Merged revisions 78207 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line
#7930: fix stripid
........
| author | Ezio Melotti <ezio.melotti@gmail.com> |
|---|---|
| date | Tue, 16 Feb 2010 23:29:44 +0000 |
| parents | 35469e79ff80 |
| children | 787b969d37f0 |
| rev | line source |
|---|---|
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1 /* |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 * Secret Labs' Regular Expression Engine |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 * |
|
13119
fd12cd996154
- removed "alpha only" licensing restriction
Fredrik Lundh <fredrik@pythonware.com>
parents:
13118
diff
changeset
|
4 * regular expression matching engine |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 * |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 * partial history: |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
7 * 1999-10-24 fl created (based on existing template matcher code) |
|
15355
2a3696d32721
-- properly reset groups in findall (bug #117612)
Fredrik Lundh <fredrik@pythonware.com>
parents:
15000
diff
changeset
|
8 * 2000-03-06 fl first alpha, sort of |
|
2a3696d32721
-- properly reset groups in findall (bug #117612)
Fredrik Lundh <fredrik@pythonware.com>
parents:
15000
diff
changeset
|
9 * 2000-08-01 fl fixes for 1.6b1 |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
10 * 2000-08-07 fl use PyOS_CheckStack() if available |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
11 * 2000-09-20 fl added expand method |
| 17144 | 12 * 2001-03-20 fl lots of fixes for 2.1b2 |
|
17532
dd6be625a923
SRE: made "copyright" string static, to avoid potential linking
Fredrik Lundh <fredrik@pythonware.com>
parents:
17144
diff
changeset
|
13 * 2001-04-15 fl export copyright as Python attribute, not global |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
14 * 2001-04-28 fl added __copy__ methods (work in progress) |
|
26345
9f469da591a9
fix for SF #635398 (don't "downcast" return strings from unicode to ascii)
Fredrik Lundh <fredrik@pythonware.com>
parents:
26141
diff
changeset
|
15 * 2001-05-14 fl fixes for 1.5.2 compatibility |
|
18367
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
16 * 2001-07-01 fl added BIGCHARSET support (from Martin von Loewis) |
| 20534 | 17 * 2001-10-18 fl fixed group reset issue (from Matthew Mueller) |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
18 * 2001-10-20 fl added split primitive; reenable unicode for 1.6/2.0/2.1 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
19 * 2001-10-21 fl added sub/subn primitive |
|
20660
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
20 * 2001-10-24 fl added finditer primitive (for 2.2 only) |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
21 * 2001-12-07 fl fixed memory leak in sub/subn (Guido van Rossum) |
|
26345
9f469da591a9
fix for SF #635398 (don't "downcast" return strings from unicode to ascii)
Fredrik Lundh <fredrik@pythonware.com>
parents:
26141
diff
changeset
|
22 * 2002-11-09 fl fixed empty sub/subn return type |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
23 * 2003-04-18 mvl fully support 4-byte codes |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
24 * 2003-10-17 gn implemented non recursive scheme |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 * |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
26 * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 * |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
28 * This version of the SRE library can be redistributed under CNRI's |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
29 * Python 1.6 license. For any other use, please contact Secret Labs |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
30 * AB (info@pythonware.com). |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
31 * |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 * Portions of this engine have been developed in cooperation with |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
33 * CNRI. Hewlett-Packard provided funding for 1.6 integration and |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 * other compatibility work. |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 #ifndef SRE_RECURSIVE |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 |
|
17532
dd6be625a923
SRE: made "copyright" string static, to avoid potential linking
Fredrik Lundh <fredrik@pythonware.com>
parents:
17144
diff
changeset
|
39 static char copyright[] = |
|
26345
9f469da591a9
fix for SF #635398 (don't "downcast" return strings from unicode to ascii)
Fredrik Lundh <fredrik@pythonware.com>
parents:
26141
diff
changeset
|
40 " SRE 2.2.2 Copyright (c) 1997-2002 by Secret Labs AB "; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 |
| 38770 | 42 #define PY_SSIZE_T_CLEAN |
| 43 | |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 #include "Python.h" |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
45 #include "structmember.h" /* offsetof */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 #include "sre.h" |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
49 #include <ctype.h> |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 |
| 13118 | 51 /* name of this module, minus the leading underscore */ |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
52 #if !defined(SRE_MODULE) |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
53 #define SRE_MODULE "sre" |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
54 #endif |
| 13118 | 55 |
| 37017 | 56 #define SRE_PY_MODULE "re" |
| 57 | |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 /* defining this one enables tracing */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
59 #undef VERBOSE |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
61 #if PY_VERSION_HEX >= 0x01060000 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
62 #if PY_VERSION_HEX < 0x02020000 || defined(Py_USING_UNICODE) |
|
13299
2fb3fb646cc5
today's SRE update:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13247
diff
changeset
|
63 /* defining this enables unicode support (default under 1.6a1 and later) */ |
| 13118 | 64 #define HAVE_UNICODE |
| 65 #endif | |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
66 #endif |
| 13118 | 67 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
68 /* -------------------------------------------------------------------- */ |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
69 /* optional features */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
70 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
71 /* enables fast searching */ |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
72 #define USE_FAST_SEARCH |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
73 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
74 /* enables aggressive inlining (always on for Visual C) */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
75 #undef USE_INLINE |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
76 |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
77 /* enables copy/deepcopy handling (work in progress) */ |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
78 #undef USE_BUILTIN_COPY |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
79 |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
80 #if PY_VERSION_HEX < 0x01060000 |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
81 #define PyObject_DEL(op) PyMem_DEL((op)) |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
82 #endif |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
83 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
84 /* -------------------------------------------------------------------- */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
85 |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
86 #if defined(_MSC_VER) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 #pragma optimize("agtw", on) /* doesn't seem to make much difference... */ |
|
13361
bef7b629ac95
maintenance release:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13328
diff
changeset
|
88 #pragma warning(disable: 4710) /* who cares if functions are not inlined ;-) */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 /* fastest possible local call under MSVC */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 #define LOCAL(type) static __inline type __fastcall |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
91 #elif defined(USE_INLINE) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
92 #define LOCAL(type) static inline type |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 #else |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
94 #define LOCAL(type) static type |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 #endif |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 /* error codes */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 #define SRE_ERROR_ILLEGAL -1 /* illegal opcode */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
99 #define SRE_ERROR_STATE -2 /* illegal state */ |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
100 #define SRE_ERROR_RECURSION_LIMIT -3 /* runaway recursion */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 #define SRE_ERROR_MEMORY -9 /* out of memory */ |
|
44602
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
102 #define SRE_ERROR_INTERRUPTED -10 /* signal handler raised exception */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
104 #if defined(VERBOSE) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 #define TRACE(v) printf v |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 #else |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
107 #define TRACE(v) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
108 #endif |
| 13118 | 109 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
110 /* -------------------------------------------------------------------- */ |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
111 /* search engine state */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 |
| 13118 | 113 /* default character predicates (run sre_chars.py to regenerate tables) */ |
| 114 | |
| 115 #define SRE_DIGIT_MASK 1 | |
| 116 #define SRE_SPACE_MASK 2 | |
| 117 #define SRE_LINEBREAK_MASK 4 | |
| 118 #define SRE_ALNUM_MASK 8 | |
| 119 #define SRE_WORD_MASK 16 | |
| 120 | |
|
19963
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
121 /* FIXME: this assumes ASCII. create tables in init_sre() instead */ |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
122 |
| 13118 | 123 static char sre_char_info[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 2, |
| 124 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, | |
| 125 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, | |
| 126 25, 25, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, | |
| 127 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, | |
| 128 0, 0, 16, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, | |
| 129 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0 }; | |
| 130 | |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
131 static char sre_char_lower[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, |
| 13118 | 132 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, |
| 133 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, | |
| 134 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, | |
| 135 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, | |
| 136 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, | |
| 137 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, | |
| 138 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, | |
| 139 120, 121, 122, 123, 124, 125, 126, 127 }; | |
| 140 | |
| 141 #define SRE_IS_DIGIT(ch)\ | |
| 142 ((ch) < 128 ? (sre_char_info[(ch)] & SRE_DIGIT_MASK) : 0) | |
| 143 #define SRE_IS_SPACE(ch)\ | |
| 144 ((ch) < 128 ? (sre_char_info[(ch)] & SRE_SPACE_MASK) : 0) | |
| 145 #define SRE_IS_LINEBREAK(ch)\ | |
| 146 ((ch) < 128 ? (sre_char_info[(ch)] & SRE_LINEBREAK_MASK) : 0) | |
| 147 #define SRE_IS_ALNUM(ch)\ | |
| 148 ((ch) < 128 ? (sre_char_info[(ch)] & SRE_ALNUM_MASK) : 0) | |
| 149 #define SRE_IS_WORD(ch)\ | |
| 150 ((ch) < 128 ? (sre_char_info[(ch)] & SRE_WORD_MASK) : 0) | |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 |
| 17144 | 152 static unsigned int sre_lower(unsigned int ch) |
| 153 { | |
|
31525
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
154 return ((ch) < 128 ? (unsigned int)sre_char_lower[ch] : ch); |
| 17144 | 155 } |
| 156 | |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
157 /* locale-specific character predicates */ |
|
31525
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
158 /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids |
|
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
159 * warnings when c's type supports only numbers < N+1 */ |
|
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
160 #define SRE_LOC_IS_DIGIT(ch) (!((ch) & ~255) ? isdigit((ch)) : 0) |
|
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
161 #define SRE_LOC_IS_SPACE(ch) (!((ch) & ~255) ? isspace((ch)) : 0) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
162 #define SRE_LOC_IS_LINEBREAK(ch) ((ch) == '\n') |
|
31525
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
163 #define SRE_LOC_IS_ALNUM(ch) (!((ch) & ~255) ? isalnum((ch)) : 0) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
164 #define SRE_LOC_IS_WORD(ch) (SRE_LOC_IS_ALNUM((ch)) || (ch) == '_') |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 |
| 17144 | 166 static unsigned int sre_lower_locale(unsigned int ch) |
| 167 { | |
|
31525
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
168 return ((ch) < 256 ? (unsigned int)tolower((ch)) : ch); |
| 17144 | 169 } |
| 170 | |
| 13118 | 171 /* unicode-specific character predicates */ |
| 172 | |
| 173 #if defined(HAVE_UNICODE) | |
| 17144 | 174 |
| 13118 | 175 #define SRE_UNI_IS_DIGIT(ch) Py_UNICODE_ISDIGIT((Py_UNICODE)(ch)) |
| 176 #define SRE_UNI_IS_SPACE(ch) Py_UNICODE_ISSPACE((Py_UNICODE)(ch)) | |
| 177 #define SRE_UNI_IS_LINEBREAK(ch) Py_UNICODE_ISLINEBREAK((Py_UNICODE)(ch)) | |
|
13299
2fb3fb646cc5
today's SRE update:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13247
diff
changeset
|
178 #define SRE_UNI_IS_ALNUM(ch) Py_UNICODE_ISALNUM((Py_UNICODE)(ch)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
179 #define SRE_UNI_IS_WORD(ch) (SRE_UNI_IS_ALNUM((ch)) || (ch) == '_') |
| 17144 | 180 |
| 181 static unsigned int sre_lower_unicode(unsigned int ch) | |
| 182 { | |
| 183 return (unsigned int) Py_UNICODE_TOLOWER((Py_UNICODE)(ch)); | |
| 184 } | |
| 185 | |
| 13118 | 186 #endif |
| 187 | |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 LOCAL(int) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 sre_category(SRE_CODE category, unsigned int ch) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
190 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
191 switch (category) { |
| 13118 | 192 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
193 case SRE_CATEGORY_DIGIT: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
194 return SRE_IS_DIGIT(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
195 case SRE_CATEGORY_NOT_DIGIT: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
196 return !SRE_IS_DIGIT(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
197 case SRE_CATEGORY_SPACE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
198 return SRE_IS_SPACE(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
199 case SRE_CATEGORY_NOT_SPACE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
200 return !SRE_IS_SPACE(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
201 case SRE_CATEGORY_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
202 return SRE_IS_WORD(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
203 case SRE_CATEGORY_NOT_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
204 return !SRE_IS_WORD(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
205 case SRE_CATEGORY_LINEBREAK: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
206 return SRE_IS_LINEBREAK(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
207 case SRE_CATEGORY_NOT_LINEBREAK: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
208 return !SRE_IS_LINEBREAK(ch); |
| 13118 | 209 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
210 case SRE_CATEGORY_LOC_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
211 return SRE_LOC_IS_WORD(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
212 case SRE_CATEGORY_LOC_NOT_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
213 return !SRE_LOC_IS_WORD(ch); |
| 13118 | 214 |
| 215 #if defined(HAVE_UNICODE) | |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
216 case SRE_CATEGORY_UNI_DIGIT: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
217 return SRE_UNI_IS_DIGIT(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
218 case SRE_CATEGORY_UNI_NOT_DIGIT: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
219 return !SRE_UNI_IS_DIGIT(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
220 case SRE_CATEGORY_UNI_SPACE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
221 return SRE_UNI_IS_SPACE(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
222 case SRE_CATEGORY_UNI_NOT_SPACE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
223 return !SRE_UNI_IS_SPACE(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
224 case SRE_CATEGORY_UNI_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
225 return SRE_UNI_IS_WORD(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
226 case SRE_CATEGORY_UNI_NOT_WORD: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
227 return !SRE_UNI_IS_WORD(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
228 case SRE_CATEGORY_UNI_LINEBREAK: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
229 return SRE_UNI_IS_LINEBREAK(ch); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
230 case SRE_CATEGORY_UNI_NOT_LINEBREAK: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
231 return !SRE_UNI_IS_LINEBREAK(ch); |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
232 #else |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
233 case SRE_CATEGORY_UNI_DIGIT: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
234 return SRE_IS_DIGIT(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
235 case SRE_CATEGORY_UNI_NOT_DIGIT: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
236 return !SRE_IS_DIGIT(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
237 case SRE_CATEGORY_UNI_SPACE: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
238 return SRE_IS_SPACE(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
239 case SRE_CATEGORY_UNI_NOT_SPACE: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
240 return !SRE_IS_SPACE(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
241 case SRE_CATEGORY_UNI_WORD: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
242 return SRE_LOC_IS_WORD(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
243 case SRE_CATEGORY_UNI_NOT_WORD: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
244 return !SRE_LOC_IS_WORD(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
245 case SRE_CATEGORY_UNI_LINEBREAK: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
246 return SRE_IS_LINEBREAK(ch); |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
247 case SRE_CATEGORY_UNI_NOT_LINEBREAK: |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
248 return !SRE_IS_LINEBREAK(ch); |
| 13118 | 249 #endif |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
250 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
251 return 0; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 /* helpers */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
255 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
256 static void |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
257 data_stack_dealloc(SRE_STATE* state) |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
258 { |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
259 if (state->data_stack) { |
|
38444
08bf0822c50a
needforspeed: use PyObject_MALLOC instead of system malloc for small
Jack Diederich <jackdied@gmail.com>
parents:
37833
diff
changeset
|
260 PyMem_FREE(state->data_stack); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
261 state->data_stack = NULL; |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
262 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
263 state->data_stack_size = state->data_stack_base = 0; |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
264 } |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
265 |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
266 static int |
| 38770 | 267 data_stack_grow(SRE_STATE* state, Py_ssize_t size) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 { |
| 38770 | 269 Py_ssize_t minsize, cursize; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
270 minsize = state->data_stack_base+size; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
271 cursize = state->data_stack_size; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
272 if (cursize < minsize) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
273 void* stack; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
274 cursize = minsize+minsize/4+1024; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
275 TRACE(("allocate/grow stack %d\n", cursize)); |
|
38444
08bf0822c50a
needforspeed: use PyObject_MALLOC instead of system malloc for small
Jack Diederich <jackdied@gmail.com>
parents:
37833
diff
changeset
|
276 stack = PyMem_REALLOC(state->data_stack, cursize); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
277 if (!stack) { |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
278 data_stack_dealloc(state); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
279 return SRE_ERROR_MEMORY; |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
280 } |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
281 state->data_stack = (char *)stack; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
282 state->data_stack_size = cursize; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
283 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
284 return 0; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
286 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
287 /* generate 8-bit version */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 #define SRE_CHAR unsigned char |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
290 #define SRE_AT sre_at |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
291 #define SRE_COUNT sre_count |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
292 #define SRE_CHARSET sre_charset |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
293 #define SRE_INFO sre_info |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 #define SRE_MATCH sre_match |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
295 #define SRE_MATCH_CONTEXT sre_match_context |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 #define SRE_SEARCH sre_search |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
297 #define SRE_LITERAL_TEMPLATE sre_literal_template |
| 13118 | 298 |
| 299 #if defined(HAVE_UNICODE) | |
| 300 | |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 #define SRE_RECURSIVE |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
302 #include "_sre.c" |
| 13118 | 303 #undef SRE_RECURSIVE |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
305 #undef SRE_LITERAL_TEMPLATE |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
306 #undef SRE_SEARCH |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 #undef SRE_MATCH |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
308 #undef SRE_MATCH_CONTEXT |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
309 #undef SRE_INFO |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
310 #undef SRE_CHARSET |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
311 #undef SRE_COUNT |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 #undef SRE_AT |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 #undef SRE_CHAR |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
315 /* generate 16-bit unicode version */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
317 #define SRE_CHAR Py_UNICODE |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 #define SRE_AT sre_uat |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
319 #define SRE_COUNT sre_ucount |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
320 #define SRE_CHARSET sre_ucharset |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
321 #define SRE_INFO sre_uinfo |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 #define SRE_MATCH sre_umatch |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
323 #define SRE_MATCH_CONTEXT sre_umatch_context |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 #define SRE_SEARCH sre_usearch |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
325 #define SRE_LITERAL_TEMPLATE sre_uliteral_template |
| 13118 | 326 #endif |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 #endif /* SRE_RECURSIVE */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 /* -------------------------------------------------------------------- */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 /* String matching engine */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 /* the following section is compiled twice, with different character |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 settings */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 LOCAL(int) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 SRE_AT(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
339 /* check if pointer is at given position */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 |
| 38770 | 341 Py_ssize_t thisp, thatp; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
342 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
343 switch (at) { |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
344 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
345 case SRE_AT_BEGINNING: |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
346 case SRE_AT_BEGINNING_STRING: |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
347 return ((void*) ptr == state->beginning); |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
348 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
349 case SRE_AT_BEGINNING_LINE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
350 return ((void*) ptr == state->beginning || |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
351 SRE_IS_LINEBREAK((int) ptr[-1])); |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
352 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
353 case SRE_AT_END: |
|
13247
589202c64887
-- changed $ to match before a trailing newline, even
Fredrik Lundh <fredrik@pythonware.com>
parents:
13201
diff
changeset
|
354 return (((void*) (ptr+1) == state->end && |
|
589202c64887
-- changed $ to match before a trailing newline, even
Fredrik Lundh <fredrik@pythonware.com>
parents:
13201
diff
changeset
|
355 SRE_IS_LINEBREAK((int) ptr[0])) || |
|
589202c64887
-- changed $ to match before a trailing newline, even
Fredrik Lundh <fredrik@pythonware.com>
parents:
13201
diff
changeset
|
356 ((void*) ptr == state->end)); |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
357 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
358 case SRE_AT_END_LINE: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
359 return ((void*) ptr == state->end || |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
360 SRE_IS_LINEBREAK((int) ptr[0])); |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
361 |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
362 case SRE_AT_END_STRING: |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
363 return ((void*) ptr == state->end); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
364 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
365 case SRE_AT_BOUNDARY: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
366 if (state->beginning == state->end) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
367 return 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
368 thatp = ((void*) ptr > state->beginning) ? |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
369 SRE_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
370 thisp = ((void*) ptr < state->end) ? |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
371 SRE_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
372 return thisp != thatp; |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
373 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
374 case SRE_AT_NON_BOUNDARY: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
375 if (state->beginning == state->end) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
376 return 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
377 thatp = ((void*) ptr > state->beginning) ? |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
378 SRE_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
379 thisp = ((void*) ptr < state->end) ? |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
380 SRE_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
381 return thisp == thatp; |
| 17144 | 382 |
| 383 case SRE_AT_LOC_BOUNDARY: | |
| 384 if (state->beginning == state->end) | |
| 385 return 0; | |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
386 thatp = ((void*) ptr > state->beginning) ? |
| 17144 | 387 SRE_LOC_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
388 thisp = ((void*) ptr < state->end) ? |
| 17144 | 389 SRE_LOC_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
390 return thisp != thatp; |
| 17144 | 391 |
| 392 case SRE_AT_LOC_NON_BOUNDARY: | |
| 393 if (state->beginning == state->end) | |
| 394 return 0; | |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
395 thatp = ((void*) ptr > state->beginning) ? |
| 17144 | 396 SRE_LOC_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
397 thisp = ((void*) ptr < state->end) ? |
| 17144 | 398 SRE_LOC_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
399 return thisp == thatp; |
| 17144 | 400 |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
401 #if defined(HAVE_UNICODE) |
| 17144 | 402 case SRE_AT_UNI_BOUNDARY: |
| 403 if (state->beginning == state->end) | |
| 404 return 0; | |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
405 thatp = ((void*) ptr > state->beginning) ? |
| 17144 | 406 SRE_UNI_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
407 thisp = ((void*) ptr < state->end) ? |
| 17144 | 408 SRE_UNI_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
409 return thisp != thatp; |
| 17144 | 410 |
| 411 case SRE_AT_UNI_NON_BOUNDARY: | |
| 412 if (state->beginning == state->end) | |
| 413 return 0; | |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
414 thatp = ((void*) ptr > state->beginning) ? |
| 17144 | 415 SRE_UNI_IS_WORD((int) ptr[-1]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
416 thisp = ((void*) ptr < state->end) ? |
| 17144 | 417 SRE_UNI_IS_WORD((int) ptr[0]) : 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
418 return thisp == thatp; |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
419 #endif |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
420 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
421 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
423 return 0; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
424 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 LOCAL(int) |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
427 SRE_CHARSET(SRE_CODE* set, SRE_CODE ch) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
429 /* check if character is a member of the given set */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
431 int ok = 1; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
433 for (;;) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
434 switch (*set++) { |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
435 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
436 case SRE_OP_FAILURE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
437 return !ok; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
438 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
439 case SRE_OP_LITERAL: |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
440 /* <LITERAL> <code> */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
441 if (ch == set[0]) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
442 return ok; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
443 set++; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
444 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
445 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
446 case SRE_OP_CATEGORY: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
447 /* <CATEGORY> <code> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
448 if (sre_category(set[0], (int) ch)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
449 return ok; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
450 set += 1; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
451 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
453 case SRE_OP_CHARSET: |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
454 if (sizeof(SRE_CODE) == 2) { |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
455 /* <CHARSET> <bitmap> (16 bits per code word) */ |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
456 if (ch < 256 && (set[ch >> 4] & (1 << (ch & 15)))) |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
457 return ok; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
458 set += 16; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
459 } |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
460 else { |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
461 /* <CHARSET> <bitmap> (32 bits per code word) */ |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
462 if (ch < 256 && (set[ch >> 5] & (1 << (ch & 31)))) |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
463 return ok; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
464 set += 8; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
465 } |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
466 break; |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
467 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
468 case SRE_OP_RANGE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
469 /* <RANGE> <lower> <upper> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
470 if (set[0] <= ch && ch <= set[1]) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
471 return ok; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
472 set += 2; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
473 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
474 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
475 case SRE_OP_NEGATE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
476 ok = !ok; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
477 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
478 |
|
18367
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
479 case SRE_OP_BIGCHARSET: |
|
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
480 /* <BIGCHARSET> <blockcount> <256 blockindices> <blocks> */ |
|
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
481 { |
| 38770 | 482 Py_ssize_t count, block; |
|
18367
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
483 count = *(set++); |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
484 |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
485 if (sizeof(SRE_CODE) == 2) { |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
486 block = ((unsigned char*)set)[ch >> 8]; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
487 set += 128; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
488 if (set[block*16 + ((ch & 255)>>4)] & (1 << (ch & 15))) |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
489 return ok; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
490 set += count*16; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
491 } |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
492 else { |
|
31525
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
493 /* !(c & ~N) == (c < N+1) for any unsigned c, this avoids |
|
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
494 * warnings when c's type supports only numbers < N+1 */ |
|
4ef568c653d9
- Fixing annoying warnings.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
31180
diff
changeset
|
495 if (!(ch & ~65535)) |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
496 block = ((unsigned char*)set)[ch >> 8]; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
497 else |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
498 block = -1; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
499 set += 64; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
500 if (block >=0 && |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
501 (set[block*8 + ((ch & 255)>>5)] & (1 << (ch & 31)))) |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
502 return ok; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
503 set += count*8; |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
504 } |
|
18367
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
505 break; |
|
eaabca13174e
pythonware repository roundtrip (untabification)
Fredrik Lundh <fredrik@pythonware.com>
parents:
18366
diff
changeset
|
506 } |
|
18366
451c0abbf8a9
added martin's BIGCHARSET patch to SRE 2.1.1. martin reports 2x
Fredrik Lundh <fredrik@pythonware.com>
parents:
18363
diff
changeset
|
507 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
508 default: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
509 /* internal error -- there's not much we can do about it |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
510 here, so let's just pretend it didn't match... */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
511 return 0; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
512 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
513 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 |
| 38770 | 516 LOCAL(Py_ssize_t) SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern); |
| 517 | |
| 518 LOCAL(Py_ssize_t) | |
| 519 SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) | |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
520 { |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
521 SRE_CODE chr; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
522 SRE_CHAR* ptr = (SRE_CHAR *)state->ptr; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
523 SRE_CHAR* end = (SRE_CHAR *)state->end; |
| 38770 | 524 Py_ssize_t i; |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
525 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
526 /* adjust end */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
527 if (maxcount < end - ptr && maxcount != 65535) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
528 end = ptr + maxcount; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
529 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
530 switch (pattern[0]) { |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
531 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
532 case SRE_OP_IN: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
533 /* repeated set */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
534 TRACE(("|%p|%p|COUNT IN\n", pattern, ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
535 while (ptr < end && SRE_CHARSET(pattern + 2, *ptr)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
536 ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
537 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
538 |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
539 case SRE_OP_ANY: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
540 /* repeated dot wildcard. */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
541 TRACE(("|%p|%p|COUNT ANY\n", pattern, ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
542 while (ptr < end && !SRE_IS_LINEBREAK(*ptr)) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
543 ptr++; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
544 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
545 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
546 case SRE_OP_ANY_ALL: |
|
33398
d1f8c632b605
Fixing bug #817234, which made SRE get into an infinite loop on
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
32695
diff
changeset
|
547 /* repeated dot wildcard. skip to the end of the target |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
548 string, and backtrack from there */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
549 TRACE(("|%p|%p|COUNT ANY_ALL\n", pattern, ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
550 ptr = end; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
551 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
552 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
553 case SRE_OP_LITERAL: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
554 /* repeated literal */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
555 chr = pattern[1]; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
556 TRACE(("|%p|%p|COUNT LITERAL %d\n", pattern, ptr, chr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
557 while (ptr < end && (SRE_CODE) *ptr == chr) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
558 ptr++; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
559 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
560 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
561 case SRE_OP_LITERAL_IGNORE: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
562 /* repeated literal */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
563 chr = pattern[1]; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
564 TRACE(("|%p|%p|COUNT LITERAL_IGNORE %d\n", pattern, ptr, chr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
565 while (ptr < end && (SRE_CODE) state->lower(*ptr) == chr) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
566 ptr++; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
567 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
568 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
569 case SRE_OP_NOT_LITERAL: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
570 /* repeated non-literal */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
571 chr = pattern[1]; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
572 TRACE(("|%p|%p|COUNT NOT_LITERAL %d\n", pattern, ptr, chr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
573 while (ptr < end && (SRE_CODE) *ptr != chr) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
574 ptr++; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
575 break; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
576 |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
577 case SRE_OP_NOT_LITERAL_IGNORE: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
578 /* repeated non-literal */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
579 chr = pattern[1]; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
580 TRACE(("|%p|%p|COUNT NOT_LITERAL_IGNORE %d\n", pattern, ptr, chr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
581 while (ptr < end && (SRE_CODE) state->lower(*ptr) != chr) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
582 ptr++; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
583 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
584 |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
585 default: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
586 /* repeated single character pattern */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
587 TRACE(("|%p|%p|COUNT SUBPATTERN\n", pattern, ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
588 while ((SRE_CHAR*) state->ptr < end) { |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
589 i = SRE_MATCH(state, pattern); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
590 if (i < 0) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
591 return i; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
592 if (!i) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
593 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
594 } |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
595 TRACE(("|%p|%p|COUNT %d\n", pattern, ptr, |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
596 (SRE_CHAR*) state->ptr - ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
597 return (SRE_CHAR*) state->ptr - ptr; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
598 } |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
599 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
600 TRACE(("|%p|%p|COUNT %d\n", pattern, ptr, ptr - (SRE_CHAR*) state->ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
601 return ptr - (SRE_CHAR*) state->ptr; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
602 } |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
603 |
|
14234
3e5d6e2093df
don't mistake memory errors (including reaching the recursion limit)
Fredrik Lundh <fredrik@pythonware.com>
parents:
14056
diff
changeset
|
604 #if 0 /* not used in this release */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 LOCAL(int) |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
606 SRE_INFO(SRE_STATE* state, SRE_CODE* pattern) |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
607 { |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
608 /* check if an SRE_OP_INFO block matches at the current position. |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
609 returns the number of SRE_CODE objects to skip if successful, 0 |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
610 if no match */ |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
611 |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
612 SRE_CHAR* end = state->end; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
613 SRE_CHAR* ptr = state->ptr; |
| 38770 | 614 Py_ssize_t i; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
615 |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
616 /* check minimal length */ |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
617 if (pattern[3] && (end - ptr) < pattern[3]) |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
618 return 0; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
619 |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
620 /* check known prefix */ |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
621 if (pattern[2] & SRE_INFO_PREFIX && pattern[5] > 1) { |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
622 /* <length> <skip> <prefix data> <overlap data> */ |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
623 for (i = 0; i < pattern[5]; i++) |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
624 if ((SRE_CODE) ptr[i] != pattern[7 + i]) |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
625 return 0; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
626 return pattern[0] + 2 * pattern[6]; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
627 } |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
628 return pattern[0]; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
629 } |
|
14234
3e5d6e2093df
don't mistake memory errors (including reaching the recursion limit)
Fredrik Lundh <fredrik@pythonware.com>
parents:
14056
diff
changeset
|
630 #endif |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
631 |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
632 /* The macros below should be used to protect recursive SRE_MATCH() |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
633 * calls that *failed* and do *not* return immediately (IOW, those |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
634 * that will backtrack). Explaining: |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
635 * |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
636 * - Recursive SRE_MATCH() returned true: that's usually a success |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
637 * (besides atypical cases like ASSERT_NOT), therefore there's no |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
638 * reason to restore lastmark; |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
639 * |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
640 * - Recursive SRE_MATCH() returned false but the current SRE_MATCH() |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
641 * is returning to the caller: If the current SRE_MATCH() is the |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
642 * top function of the recursion, returning false will be a matching |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
643 * failure, and it doesn't matter where lastmark is pointing to. |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
644 * If it's *not* the top function, it will be a recursive SRE_MATCH() |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
645 * failure by itself, and the calling SRE_MATCH() will have to deal |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
646 * with the failure by the same rules explained here (it will restore |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
647 * lastmark by itself if necessary); |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
648 * |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
649 * - Recursive SRE_MATCH() returned false, and will continue the |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
650 * outside 'for' loop: must be protected when breaking, since the next |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
651 * OP could potentially depend on lastmark; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
652 * |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
653 * - Recursive SRE_MATCH() returned false, and will be called again |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
654 * inside a local for/while loop: must be protected between each |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
655 * loop iteration, since the recursive SRE_MATCH() could do anything, |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
656 * and could potentially depend on lastmark. |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
657 * |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
658 * For more information, check the discussion at SF patch #712900. |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
659 */ |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
660 #define LASTMARK_SAVE() \ |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
661 do { \ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
662 ctx->lastmark = state->lastmark; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
663 ctx->lastindex = state->lastindex; \ |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
664 } while (0) |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
665 #define LASTMARK_RESTORE() \ |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
666 do { \ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
667 state->lastmark = ctx->lastmark; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
668 state->lastindex = ctx->lastindex; \ |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
669 } while (0) |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
670 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
671 #define RETURN_ERROR(i) do { return i; } while(0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
672 #define RETURN_FAILURE do { ret = 0; goto exit; } while(0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
673 #define RETURN_SUCCESS do { ret = 1; goto exit; } while(0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
674 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
675 #define RETURN_ON_ERROR(i) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
676 do { if (i < 0) RETURN_ERROR(i); } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
677 #define RETURN_ON_SUCCESS(i) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
678 do { RETURN_ON_ERROR(i); if (i > 0) RETURN_SUCCESS; } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
679 #define RETURN_ON_FAILURE(i) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
680 do { RETURN_ON_ERROR(i); if (i == 0) RETURN_FAILURE; } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
681 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
682 #define SFY(x) #x |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
683 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
684 #define DATA_STACK_ALLOC(state, type, ptr) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
685 do { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
686 alloc_pos = state->data_stack_base; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
687 TRACE(("allocating %s in %d (%d)\n", \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
688 SFY(type), alloc_pos, sizeof(type))); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
689 if (state->data_stack_size < alloc_pos+sizeof(type)) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
690 int j = data_stack_grow(state, sizeof(type)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
691 if (j < 0) return j; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
692 if (ctx_pos != -1) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
693 DATA_STACK_LOOKUP_AT(state, SRE_MATCH_CONTEXT, ctx, ctx_pos); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
694 } \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
695 ptr = (type*)(state->data_stack+alloc_pos); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
696 state->data_stack_base += sizeof(type); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
697 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
698 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
699 #define DATA_STACK_LOOKUP_AT(state, type, ptr, pos) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
700 do { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
701 TRACE(("looking up %s at %d\n", SFY(type), pos)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
702 ptr = (type*)(state->data_stack+pos); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
703 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
704 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
705 #define DATA_STACK_PUSH(state, data, size) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
706 do { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
707 TRACE(("copy data in %p to %d (%d)\n", \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
708 data, state->data_stack_base, size)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
709 if (state->data_stack_size < state->data_stack_base+size) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
710 int j = data_stack_grow(state, size); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
711 if (j < 0) return j; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
712 if (ctx_pos != -1) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
713 DATA_STACK_LOOKUP_AT(state, SRE_MATCH_CONTEXT, ctx, ctx_pos); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
714 } \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
715 memcpy(state->data_stack+state->data_stack_base, data, size); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
716 state->data_stack_base += size; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
717 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
718 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
719 #define DATA_STACK_POP(state, data, size, discard) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
720 do { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
721 TRACE(("copy data to %p from %d (%d)\n", \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
722 data, state->data_stack_base-size, size)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
723 memcpy(data, state->data_stack+state->data_stack_base-size, size); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
724 if (discard) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
725 state->data_stack_base -= size; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
726 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
727 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
728 #define DATA_STACK_POP_DISCARD(state, size) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
729 do { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
730 TRACE(("discard data from %d (%d)\n", \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
731 state->data_stack_base-size, size)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
732 state->data_stack_base -= size; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
733 } while(0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
734 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
735 #define DATA_PUSH(x) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
736 DATA_STACK_PUSH(state, (x), sizeof(*(x))) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
737 #define DATA_POP(x) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
738 DATA_STACK_POP(state, (x), sizeof(*(x)), 1) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
739 #define DATA_POP_DISCARD(x) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
740 DATA_STACK_POP_DISCARD(state, sizeof(*(x))) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
741 #define DATA_ALLOC(t,p) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
742 DATA_STACK_ALLOC(state, t, p) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
743 #define DATA_LOOKUP_AT(t,p,pos) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
744 DATA_STACK_LOOKUP_AT(state,t,p,pos) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
745 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
746 #define MARK_PUSH(lastmark) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
747 do if (lastmark > 0) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
748 i = lastmark; /* ctx->lastmark may change if reallocated */ \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
749 DATA_STACK_PUSH(state, state->mark, (i+1)*sizeof(void*)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
750 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
751 #define MARK_POP(lastmark) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
752 do if (lastmark > 0) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
753 DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 1); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
754 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
755 #define MARK_POP_KEEP(lastmark) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
756 do if (lastmark > 0) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
757 DATA_STACK_POP(state, state->mark, (lastmark+1)*sizeof(void*), 0); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
758 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
759 #define MARK_POP_DISCARD(lastmark) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
760 do if (lastmark > 0) { \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
761 DATA_STACK_POP_DISCARD(state, (lastmark+1)*sizeof(void*)); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
762 } while (0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
763 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
764 #define JUMP_NONE 0 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
765 #define JUMP_MAX_UNTIL_1 1 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
766 #define JUMP_MAX_UNTIL_2 2 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
767 #define JUMP_MAX_UNTIL_3 3 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
768 #define JUMP_MIN_UNTIL_1 4 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
769 #define JUMP_MIN_UNTIL_2 5 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
770 #define JUMP_MIN_UNTIL_3 6 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
771 #define JUMP_REPEAT 7 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
772 #define JUMP_REPEAT_ONE_1 8 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
773 #define JUMP_REPEAT_ONE_2 9 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
774 #define JUMP_MIN_REPEAT_ONE 10 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
775 #define JUMP_BRANCH 11 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
776 #define JUMP_ASSERT 12 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
777 #define JUMP_ASSERT_NOT 13 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
778 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
779 #define DO_JUMP(jumpvalue, jumplabel, nextpattern) \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
780 DATA_ALLOC(SRE_MATCH_CONTEXT, nextctx); \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
781 nextctx->last_ctx_pos = ctx_pos; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
782 nextctx->jump = jumpvalue; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
783 nextctx->pattern = nextpattern; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
784 ctx_pos = alloc_pos; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
785 ctx = nextctx; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
786 goto entrance; \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
787 jumplabel: \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
788 while (0) /* gcc doesn't like labels at end of scopes */ \ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
789 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
790 typedef struct { |
| 38770 | 791 Py_ssize_t last_ctx_pos; |
| 792 Py_ssize_t jump; | |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
793 SRE_CHAR* ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
794 SRE_CODE* pattern; |
| 38770 | 795 Py_ssize_t count; |
| 796 Py_ssize_t lastmark; | |
| 797 Py_ssize_t lastindex; | |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
798 union { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
799 SRE_CODE chr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
800 SRE_REPEAT* rep; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
801 } u; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
802 } SRE_MATCH_CONTEXT; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
803 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
804 /* check if string matches the given pattern. returns <0 for |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
805 error, 0 for failure, and 1 for success */ |
| 38770 | 806 LOCAL(Py_ssize_t) |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
807 SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
808 { |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
809 SRE_CHAR* end = (SRE_CHAR *)state->end; |
| 38770 | 810 Py_ssize_t alloc_pos, ctx_pos = -1; |
| 811 Py_ssize_t i, ret = 0; | |
| 812 Py_ssize_t jump; | |
|
44602
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
813 unsigned int sigcount=0; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
814 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
815 SRE_MATCH_CONTEXT* ctx; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
816 SRE_MATCH_CONTEXT* nextctx; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
817 |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
818 TRACE(("|%p|%p|ENTER\n", pattern, state->ptr)); |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
819 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
820 DATA_ALLOC(SRE_MATCH_CONTEXT, ctx); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
821 ctx->last_ctx_pos = -1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
822 ctx->jump = JUMP_NONE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
823 ctx->pattern = pattern; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
824 ctx_pos = alloc_pos; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
825 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
826 entrance: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
827 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
828 ctx->ptr = (SRE_CHAR *)state->ptr; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
829 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
830 if (ctx->pattern[0] == SRE_OP_INFO) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
831 /* optimization info block */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
832 /* <INFO> <1=skip> <2=flags> <3=min> ... */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
833 if (ctx->pattern[3] && (end - ctx->ptr) < ctx->pattern[3]) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
834 TRACE(("reject (got %d chars, need %d)\n", |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
835 (end - ctx->ptr), ctx->pattern[3])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
836 RETURN_FAILURE; |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
837 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
838 ctx->pattern += ctx->pattern[1] + 1; |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
839 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
840 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
841 for (;;) { |
|
44602
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
842 ++sigcount; |
|
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
843 if ((0 == (sigcount & 0xfff)) && PyErr_CheckSignals()) |
|
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
844 RETURN_ERROR(SRE_ERROR_INTERRUPTED); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
845 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
846 switch (*ctx->pattern++) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
847 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
848 case SRE_OP_MARK: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
849 /* set mark */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
850 /* <MARK> <gid> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
851 TRACE(("|%p|%p|MARK %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
852 ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
853 i = ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
854 if (i & 1) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
855 state->lastindex = i/2 + 1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
856 if (i > state->lastmark) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
857 /* state->lastmark is the highest valid index in the |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
858 state->mark array. If it is increased by more than 1, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
859 the intervening marks must be set to NULL to signal |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
860 that these marks have not been encountered. */ |
| 38770 | 861 Py_ssize_t j = state->lastmark + 1; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
862 while (j < i) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
863 state->mark[j++] = NULL; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
864 state->lastmark = i; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
865 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
866 state->mark[i] = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
867 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
868 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
869 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
870 case SRE_OP_LITERAL: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
871 /* match literal string */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
872 /* <LITERAL> <code> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
873 TRACE(("|%p|%p|LITERAL %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
874 ctx->ptr, *ctx->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
875 if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] != ctx->pattern[0]) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
876 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
877 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
878 ctx->ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
879 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
880 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
881 case SRE_OP_NOT_LITERAL: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
882 /* match anything that is not literal character */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
883 /* <NOT_LITERAL> <code> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
884 TRACE(("|%p|%p|NOT_LITERAL %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
885 ctx->ptr, *ctx->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
886 if (ctx->ptr >= end || (SRE_CODE) ctx->ptr[0] == ctx->pattern[0]) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
887 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
888 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
889 ctx->ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
890 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
891 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
892 case SRE_OP_SUCCESS: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
893 /* end of pattern */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
894 TRACE(("|%p|%p|SUCCESS\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
895 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
896 RETURN_SUCCESS; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
897 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
898 case SRE_OP_AT: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
899 /* match at given position */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
900 /* <AT> <code> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
901 TRACE(("|%p|%p|AT %d\n", ctx->pattern, ctx->ptr, *ctx->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
902 if (!SRE_AT(state, ctx->ptr, *ctx->pattern)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
903 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
904 ctx->pattern++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
905 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
906 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
907 case SRE_OP_CATEGORY: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
908 /* match at given category */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
909 /* <CATEGORY> <code> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
910 TRACE(("|%p|%p|CATEGORY %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
911 ctx->ptr, *ctx->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
912 if (ctx->ptr >= end || !sre_category(ctx->pattern[0], ctx->ptr[0])) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
913 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
914 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
915 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
916 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
917 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
918 case SRE_OP_ANY: |
|
13795
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
919 /* match anything (except a newline) */ |
|
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
920 /* <ANY> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
921 TRACE(("|%p|%p|ANY\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
922 if (ctx->ptr >= end || SRE_IS_LINEBREAK(ctx->ptr[0])) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
923 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
924 ctx->ptr++; |
|
13795
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
925 break; |
|
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
926 |
|
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
927 case SRE_OP_ANY_ALL: |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
928 /* match anything */ |
|
13795
8295f8506eae
final 0.9.8 updates:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13793
diff
changeset
|
929 /* <ANY_ALL> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
930 TRACE(("|%p|%p|ANY_ALL\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
931 if (ctx->ptr >= end) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
932 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
933 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
934 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
935 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
936 case SRE_OP_IN: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
937 /* match set member (or non_member) */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
938 /* <IN> <skip> <set> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
939 TRACE(("|%p|%p|IN\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
940 if (ctx->ptr >= end || !SRE_CHARSET(ctx->pattern + 1, *ctx->ptr)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
941 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
942 ctx->pattern += ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
943 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
944 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
945 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
946 case SRE_OP_LITERAL_IGNORE: |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
947 TRACE(("|%p|%p|LITERAL_IGNORE %d\n", |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
948 ctx->pattern, ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
949 if (ctx->ptr >= end || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
950 state->lower(*ctx->ptr) != state->lower(*ctx->pattern)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
951 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
952 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
953 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
954 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
955 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
956 case SRE_OP_NOT_LITERAL_IGNORE: |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
957 TRACE(("|%p|%p|NOT_LITERAL_IGNORE %d\n", |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
958 ctx->pattern, ctx->ptr, *ctx->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
959 if (ctx->ptr >= end || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
960 state->lower(*ctx->ptr) == state->lower(*ctx->pattern)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
961 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
962 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
963 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
964 break; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
965 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
966 case SRE_OP_IN_IGNORE: |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
967 TRACE(("|%p|%p|IN_IGNORE\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
968 if (ctx->ptr >= end |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
969 || !SRE_CHARSET(ctx->pattern+1, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
970 (SRE_CODE)state->lower(*ctx->ptr))) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
971 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
972 ctx->pattern += ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
973 ctx->ptr++; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
974 break; |
|
13308
fc2ad6fa08ec
- actually enabled charset anchors in the engine (still not
Fredrik Lundh <fredrik@pythonware.com>
parents:
13306
diff
changeset
|
975 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
976 case SRE_OP_JUMP: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
977 case SRE_OP_INFO: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
978 /* jump forward */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
979 /* <JUMP> <offset> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
980 TRACE(("|%p|%p|JUMP %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
981 ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
982 ctx->pattern += ctx->pattern[0]; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
983 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
984 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
985 case SRE_OP_BRANCH: |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
986 /* alternation */ |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
987 /* <BRANCH> <0=skip> code <JUMP> ... <NULL> */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
988 TRACE(("|%p|%p|BRANCH\n", ctx->pattern, ctx->ptr)); |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
989 LASTMARK_SAVE(); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
990 ctx->u.rep = state->repeat; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
991 if (ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
992 MARK_PUSH(ctx->lastmark); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
993 for (; ctx->pattern[0]; ctx->pattern += ctx->pattern[0]) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
994 if (ctx->pattern[1] == SRE_OP_LITERAL && |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
995 (ctx->ptr >= end || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
996 (SRE_CODE) *ctx->ptr != ctx->pattern[2])) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
997 continue; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
998 if (ctx->pattern[1] == SRE_OP_IN && |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
999 (ctx->ptr >= end || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1000 !SRE_CHARSET(ctx->pattern + 3, (SRE_CODE) *ctx->ptr))) |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1001 continue; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1002 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1003 DO_JUMP(JUMP_BRANCH, jump_branch, ctx->pattern+1); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1004 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1005 if (ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1006 MARK_POP_DISCARD(ctx->lastmark); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1007 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1008 RETURN_SUCCESS; |
|
28864
16374052cb5d
Applied patch #725106, by Greg Chapman, fixing capturing groups
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28862
diff
changeset
|
1009 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1010 if (ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1011 MARK_POP_KEEP(ctx->lastmark); |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1012 LASTMARK_RESTORE(); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1013 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1014 if (ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1015 MARK_POP_DISCARD(ctx->lastmark); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1016 RETURN_FAILURE; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1017 |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1018 case SRE_OP_REPEAT_ONE: |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1019 /* match repeated sequence (maximizing regexp) */ |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1020 |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1021 /* this operator only works if the repeated item is |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1022 exactly one character wide, and we're not already |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1023 collecting backtracking points. for other cases, |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
1024 use the MAX_REPEAT operator */ |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1025 |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1026 /* <REPEAT_ONE> <skip> <1=min> <2=max> item <SUCCESS> tail */ |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1027 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1028 TRACE(("|%p|%p|REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1029 ctx->pattern[1], ctx->pattern[2])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1030 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1031 if (ctx->ptr + ctx->pattern[1] > end) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1032 RETURN_FAILURE; /* cannot match */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1033 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1034 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1035 |
|
34080
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1036 ret = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[2]); |
|
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1037 RETURN_ON_ERROR(ret); |
|
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1038 DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos); |
|
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1039 ctx->count = ret; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1040 ctx->ptr += ctx->count; |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1041 |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1042 /* when we arrive here, count contains the number of |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1043 matches, and ctx->ptr points to the tail of the target |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1044 string. check if the rest of the pattern matches, |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1045 and backtrack if not. */ |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1046 |
| 38770 | 1047 if (ctx->count < (Py_ssize_t) ctx->pattern[1]) |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1048 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1049 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1050 if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1051 /* tail is empty. we're finished */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1052 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1053 RETURN_SUCCESS; |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1054 } |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1055 |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1056 LASTMARK_SAVE(); |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1057 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1058 if (ctx->pattern[ctx->pattern[0]] == SRE_OP_LITERAL) { |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1059 /* tail starts with a literal. skip positions where |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1060 the rest of the pattern cannot possibly match */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1061 ctx->u.chr = ctx->pattern[ctx->pattern[0]+1]; |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1062 for (;;) { |
| 38770 | 1063 while (ctx->count >= (Py_ssize_t) ctx->pattern[1] && |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1064 (ctx->ptr >= end || *ctx->ptr != ctx->u.chr)) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1065 ctx->ptr--; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1066 ctx->count--; |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1067 } |
| 38770 | 1068 if (ctx->count < (Py_ssize_t) ctx->pattern[1]) |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1069 break; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1070 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1071 DO_JUMP(JUMP_REPEAT_ONE_1, jump_repeat_one_1, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1072 ctx->pattern+ctx->pattern[0]); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1073 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1074 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1075 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1076 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
1077 |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1078 LASTMARK_RESTORE(); |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
1079 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1080 ctx->ptr--; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1081 ctx->count--; |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1082 } |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1083 |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1084 } else { |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1085 /* general case */ |
| 38770 | 1086 while (ctx->count >= (Py_ssize_t) ctx->pattern[1]) { |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1087 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1088 DO_JUMP(JUMP_REPEAT_ONE_2, jump_repeat_one_2, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1089 ctx->pattern+ctx->pattern[0]); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1090 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1091 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1092 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1093 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1094 ctx->ptr--; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1095 ctx->count--; |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1096 LASTMARK_RESTORE(); |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1097 } |
|
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1098 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1099 RETURN_FAILURE; |
|
13793
4c10bc811fed
-- fixed width calculations for alternations
Fredrik Lundh <fredrik@pythonware.com>
parents:
13789
diff
changeset
|
1100 |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1101 case SRE_OP_MIN_REPEAT_ONE: |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1102 /* match repeated sequence (minimizing regexp) */ |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1103 |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1104 /* this operator only works if the repeated item is |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1105 exactly one character wide, and we're not already |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1106 collecting backtracking points. for other cases, |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1107 use the MIN_REPEAT operator */ |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1108 |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1109 /* <MIN_REPEAT_ONE> <skip> <1=min> <2=max> item <SUCCESS> tail */ |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1110 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1111 TRACE(("|%p|%p|MIN_REPEAT_ONE %d %d\n", ctx->pattern, ctx->ptr, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1112 ctx->pattern[1], ctx->pattern[2])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1113 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1114 if (ctx->ptr + ctx->pattern[1] > end) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1115 RETURN_FAILURE; /* cannot match */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1116 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1117 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1118 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1119 if (ctx->pattern[1] == 0) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1120 ctx->count = 0; |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1121 else { |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1122 /* count using pattern min as the maximum */ |
|
34080
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1123 ret = SRE_COUNT(state, ctx->pattern+3, ctx->pattern[1]); |
|
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1124 RETURN_ON_ERROR(ret); |
|
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1125 DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos); |
| 38770 | 1126 if (ret < (Py_ssize_t) ctx->pattern[1]) |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
1127 /* didn't match minimum number of times */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1128 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1129 /* advance past minimum matches of repeat */ |
|
34080
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1130 ctx->count = ret; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1131 ctx->ptr += ctx->count; |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1132 } |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1133 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1134 if (ctx->pattern[ctx->pattern[0]] == SRE_OP_SUCCESS) { |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1135 /* tail is empty. we're finished */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1136 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1137 RETURN_SUCCESS; |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1138 |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1139 } else { |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1140 /* general case */ |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
1141 LASTMARK_SAVE(); |
| 38770 | 1142 while ((Py_ssize_t)ctx->pattern[2] == 65535 |
| 1143 || ctx->count <= (Py_ssize_t)ctx->pattern[2]) { | |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1144 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1145 DO_JUMP(JUMP_MIN_REPEAT_ONE,jump_min_repeat_one, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1146 ctx->pattern+ctx->pattern[0]); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1147 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1148 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1149 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1150 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1151 state->ptr = ctx->ptr; |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1152 ret = SRE_COUNT(state, ctx->pattern+3, 1); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1153 RETURN_ON_ERROR(ret); |
|
34080
609bcdae108a
Fixing bug #1072259 in SRE.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
33553
diff
changeset
|
1154 DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1155 if (ret == 0) |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1156 break; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1157 assert(ret == 1); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1158 ctx->ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1159 ctx->count++; |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1160 LASTMARK_RESTORE(); |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1161 } |
|
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1162 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1163 RETURN_FAILURE; |
|
28603
7fe33c1541df
SF patch #720991 by Gary Herron:
Guido van Rossum <guido@python.org>
parents:
26345
diff
changeset
|
1164 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1165 case SRE_OP_REPEAT: |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1166 /* create repeat context. all the hard work is done |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
1167 by the UNTIL operator (MAX_UNTIL, MIN_UNTIL) */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1168 /* <REPEAT> <skip> <1=min> <2=max> item <UNTIL> tail */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1169 TRACE(("|%p|%p|REPEAT %d %d\n", ctx->pattern, ctx->ptr, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1170 ctx->pattern[1], ctx->pattern[2])); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1171 |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1172 /* install new repeat context */ |
|
38444
08bf0822c50a
needforspeed: use PyObject_MALLOC instead of system malloc for small
Jack Diederich <jackdied@gmail.com>
parents:
37833
diff
changeset
|
1173 ctx->u.rep = (SRE_REPEAT*) PyObject_MALLOC(sizeof(*ctx->u.rep)); |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1174 if (!ctx->u.rep) { |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1175 PyErr_NoMemory(); |
|
39452
81c6b0ed3188
Try to handle a malloc failure. I'm not entirely sure this is correct.
Neal Norwitz <nnorwitz@gmail.com>
parents:
38770
diff
changeset
|
1176 RETURN_FAILURE; |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1177 } |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1178 ctx->u.rep->count = -1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1179 ctx->u.rep->pattern = ctx->pattern; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1180 ctx->u.rep->prev = state->repeat; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1181 ctx->u.rep->last_ptr = NULL; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1182 state->repeat = ctx->u.rep; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1183 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1184 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1185 DO_JUMP(JUMP_REPEAT, jump_repeat, ctx->pattern+ctx->pattern[0]); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1186 state->repeat = ctx->u.rep->prev; |
|
38444
08bf0822c50a
needforspeed: use PyObject_MALLOC instead of system malloc for small
Jack Diederich <jackdied@gmail.com>
parents:
37833
diff
changeset
|
1187 PyObject_FREE(ctx->u.rep); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1188 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1189 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1190 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1191 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1192 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1193 RETURN_FAILURE; |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1194 |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1195 case SRE_OP_MAX_UNTIL: |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1196 /* maximizing repeat */ |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1197 /* <REPEAT> <skip> <1=min> <2=max> item <MAX_UNTIL> tail */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1198 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1199 /* FIXME: we probably need to deal with zero-width |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1200 matches in here... */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1201 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1202 ctx->u.rep = state->repeat; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1203 if (!ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1204 RETURN_ERROR(SRE_ERROR_STATE); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1205 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1206 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1207 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1208 ctx->count = ctx->u.rep->count+1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1209 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1210 TRACE(("|%p|%p|MAX_UNTIL %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1211 ctx->ptr, ctx->count)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1212 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1213 if (ctx->count < ctx->u.rep->pattern[1]) { |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1214 /* not enough matches */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1215 ctx->u.rep->count = ctx->count; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1216 DO_JUMP(JUMP_MAX_UNTIL_1, jump_max_until_1, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1217 ctx->u.rep->pattern+3); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1218 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1219 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1220 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1221 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1222 ctx->u.rep->count = ctx->count-1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1223 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1224 RETURN_FAILURE; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1225 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1226 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1227 if ((ctx->count < ctx->u.rep->pattern[2] || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1228 ctx->u.rep->pattern[2] == 65535) && |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1229 state->ptr != ctx->u.rep->last_ptr) { |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1230 /* we may have enough matches, but if we can |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1231 match another item, do so */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1232 ctx->u.rep->count = ctx->count; |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1233 LASTMARK_SAVE(); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1234 MARK_PUSH(ctx->lastmark); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1235 /* zero-width match protection */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1236 DATA_PUSH(&ctx->u.rep->last_ptr); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1237 ctx->u.rep->last_ptr = state->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1238 DO_JUMP(JUMP_MAX_UNTIL_2, jump_max_until_2, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1239 ctx->u.rep->pattern+3); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1240 DATA_POP(&ctx->u.rep->last_ptr); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1241 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1242 MARK_POP_DISCARD(ctx->lastmark); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1243 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1244 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1245 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1246 MARK_POP(ctx->lastmark); |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1247 LASTMARK_RESTORE(); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1248 ctx->u.rep->count = ctx->count-1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1249 state->ptr = ctx->ptr; |
| 13118 | 1250 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1251 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1252 /* cannot match more repeated items here. make sure the |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1253 tail matches */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1254 state->repeat = ctx->u.rep->prev; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1255 DO_JUMP(JUMP_MAX_UNTIL_3, jump_max_until_3, ctx->pattern); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1256 RETURN_ON_SUCCESS(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1257 state->repeat = ctx->u.rep; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1258 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1259 RETURN_FAILURE; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1260 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1261 case SRE_OP_MIN_UNTIL: |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1262 /* minimizing repeat */ |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1263 /* <REPEAT> <skip> <1=min> <2=max> item <MIN_UNTIL> tail */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1264 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1265 ctx->u.rep = state->repeat; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1266 if (!ctx->u.rep) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1267 RETURN_ERROR(SRE_ERROR_STATE); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1268 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1269 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1270 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1271 ctx->count = ctx->u.rep->count+1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1272 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1273 TRACE(("|%p|%p|MIN_UNTIL %d %p\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1274 ctx->ptr, ctx->count, ctx->u.rep->pattern)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1275 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1276 if (ctx->count < ctx->u.rep->pattern[1]) { |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1277 /* not enough matches */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1278 ctx->u.rep->count = ctx->count; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1279 DO_JUMP(JUMP_MIN_UNTIL_1, jump_min_until_1, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1280 ctx->u.rep->pattern+3); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1281 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1282 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1283 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1284 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1285 ctx->u.rep->count = ctx->count-1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1286 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1287 RETURN_FAILURE; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1288 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1289 |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1290 LASTMARK_SAVE(); |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1291 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1292 /* see if the tail matches */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1293 state->repeat = ctx->u.rep->prev; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1294 DO_JUMP(JUMP_MIN_UNTIL_2, jump_min_until_2, ctx->pattern); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1295 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1296 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1297 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1298 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1299 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1300 state->repeat = ctx->u.rep; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1301 state->ptr = ctx->ptr; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1302 |
|
28866
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1303 LASTMARK_RESTORE(); |
|
743ae9cb3a83
- Included detailed documentation in _sre.c explaining how, when, and why
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28865
diff
changeset
|
1304 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1305 if (ctx->count >= ctx->u.rep->pattern[2] |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1306 && ctx->u.rep->pattern[2] != 65535) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1307 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1308 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1309 ctx->u.rep->count = ctx->count; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1310 DO_JUMP(JUMP_MIN_UNTIL_3,jump_min_until_3, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1311 ctx->u.rep->pattern+3); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1312 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1313 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1314 RETURN_SUCCESS; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1315 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1316 ctx->u.rep->count = ctx->count-1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1317 state->ptr = ctx->ptr; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1318 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1319 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1320 case SRE_OP_GROUPREF: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1321 /* match backreference */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1322 TRACE(("|%p|%p|GROUPREF %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1323 ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1324 i = ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1325 { |
| 38770 | 1326 Py_ssize_t groupref = i+i; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1327 if (groupref >= state->lastmark) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1328 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1329 } else { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1330 SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1331 SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1332 if (!p || !e || e < p) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1333 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1334 while (p < e) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1335 if (ctx->ptr >= end || *ctx->ptr != *p) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1336 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1337 p++; ctx->ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1338 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1339 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1340 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1341 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1342 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1343 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1344 case SRE_OP_GROUPREF_IGNORE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1345 /* match backreference */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1346 TRACE(("|%p|%p|GROUPREF_IGNORE %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1347 ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1348 i = ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1349 { |
| 38770 | 1350 Py_ssize_t groupref = i+i; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1351 if (groupref >= state->lastmark) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1352 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1353 } else { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1354 SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1355 SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1356 if (!p || !e || e < p) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1357 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1358 while (p < e) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1359 if (ctx->ptr >= end || |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1360 state->lower(*ctx->ptr) != state->lower(*p)) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1361 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1362 p++; ctx->ptr++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1363 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1364 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1365 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1366 ctx->pattern++; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1367 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1368 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1369 case SRE_OP_GROUPREF_EXISTS: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1370 TRACE(("|%p|%p|GROUPREF_EXISTS %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1371 ctx->ptr, ctx->pattern[0])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1372 /* <GROUPREF_EXISTS> <group> <skip> codeyes <JUMP> codeno ... */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1373 i = ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1374 { |
| 38770 | 1375 Py_ssize_t groupref = i+i; |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1376 if (groupref >= state->lastmark) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1377 ctx->pattern += ctx->pattern[1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1378 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1379 } else { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1380 SRE_CHAR* p = (SRE_CHAR*) state->mark[groupref]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1381 SRE_CHAR* e = (SRE_CHAR*) state->mark[groupref+1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1382 if (!p || !e || e < p) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1383 ctx->pattern += ctx->pattern[1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1384 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1385 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1386 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1387 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1388 ctx->pattern += 2; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1389 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1390 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1391 case SRE_OP_ASSERT: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1392 /* assert subpattern */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1393 /* <ASSERT> <skip> <back> <pattern> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1394 TRACE(("|%p|%p|ASSERT %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1395 ctx->ptr, ctx->pattern[1])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1396 state->ptr = ctx->ptr - ctx->pattern[1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1397 if (state->ptr < state->beginning) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1398 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1399 DO_JUMP(JUMP_ASSERT, jump_assert, ctx->pattern+2); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1400 RETURN_ON_FAILURE(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1401 ctx->pattern += ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1402 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1403 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1404 case SRE_OP_ASSERT_NOT: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1405 /* assert not subpattern */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1406 /* <ASSERT_NOT> <skip> <back> <pattern> */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1407 TRACE(("|%p|%p|ASSERT_NOT %d\n", ctx->pattern, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1408 ctx->ptr, ctx->pattern[1])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1409 state->ptr = ctx->ptr - ctx->pattern[1]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1410 if (state->ptr >= state->beginning) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1411 DO_JUMP(JUMP_ASSERT_NOT, jump_assert_not, ctx->pattern+2); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1412 if (ret) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1413 RETURN_ON_ERROR(ret); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1414 RETURN_FAILURE; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1415 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1416 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1417 ctx->pattern += ctx->pattern[0]; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1418 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1419 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1420 case SRE_OP_FAILURE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1421 /* immediate failure */ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1422 TRACE(("|%p|%p|FAILURE\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1423 RETURN_FAILURE; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1424 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1425 default: |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1426 TRACE(("|%p|%p|UNKNOWN %d\n", ctx->pattern, ctx->ptr, |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1427 ctx->pattern[-1])); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1428 RETURN_ERROR(SRE_ERROR_ILLEGAL); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1429 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1430 } |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1431 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1432 exit: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1433 ctx_pos = ctx->last_ctx_pos; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1434 jump = ctx->jump; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1435 DATA_POP_DISCARD(ctx); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1436 if (ctx_pos == -1) |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1437 return ret; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1438 DATA_LOOKUP_AT(SRE_MATCH_CONTEXT, ctx, ctx_pos); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1439 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1440 switch (jump) { |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1441 case JUMP_MAX_UNTIL_2: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1442 TRACE(("|%p|%p|JUMP_MAX_UNTIL_2\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1443 goto jump_max_until_2; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1444 case JUMP_MAX_UNTIL_3: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1445 TRACE(("|%p|%p|JUMP_MAX_UNTIL_3\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1446 goto jump_max_until_3; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1447 case JUMP_MIN_UNTIL_2: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1448 TRACE(("|%p|%p|JUMP_MIN_UNTIL_2\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1449 goto jump_min_until_2; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1450 case JUMP_MIN_UNTIL_3: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1451 TRACE(("|%p|%p|JUMP_MIN_UNTIL_3\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1452 goto jump_min_until_3; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1453 case JUMP_BRANCH: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1454 TRACE(("|%p|%p|JUMP_BRANCH\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1455 goto jump_branch; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1456 case JUMP_MAX_UNTIL_1: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1457 TRACE(("|%p|%p|JUMP_MAX_UNTIL_1\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1458 goto jump_max_until_1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1459 case JUMP_MIN_UNTIL_1: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1460 TRACE(("|%p|%p|JUMP_MIN_UNTIL_1\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1461 goto jump_min_until_1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1462 case JUMP_REPEAT: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1463 TRACE(("|%p|%p|JUMP_REPEAT\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1464 goto jump_repeat; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1465 case JUMP_REPEAT_ONE_1: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1466 TRACE(("|%p|%p|JUMP_REPEAT_ONE_1\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1467 goto jump_repeat_one_1; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1468 case JUMP_REPEAT_ONE_2: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1469 TRACE(("|%p|%p|JUMP_REPEAT_ONE_2\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1470 goto jump_repeat_one_2; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1471 case JUMP_MIN_REPEAT_ONE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1472 TRACE(("|%p|%p|JUMP_MIN_REPEAT_ONE\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1473 goto jump_min_repeat_one; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1474 case JUMP_ASSERT: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1475 TRACE(("|%p|%p|JUMP_ASSERT\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1476 goto jump_assert; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1477 case JUMP_ASSERT_NOT: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1478 TRACE(("|%p|%p|JUMP_ASSERT_NOT\n", ctx->pattern, ctx->ptr)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1479 goto jump_assert_not; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1480 case JUMP_NONE: |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1481 TRACE(("|%p|%p|RETURN %d\n", ctx->pattern, ctx->ptr, ret)); |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1482 break; |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1483 } |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1484 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1485 return ret; /* should never get here */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1486 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1487 |
| 38770 | 1488 LOCAL(Py_ssize_t) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1489 SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern) |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1490 { |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1491 SRE_CHAR* ptr = (SRE_CHAR *)state->start; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1492 SRE_CHAR* end = (SRE_CHAR *)state->end; |
| 38770 | 1493 Py_ssize_t status = 0; |
| 1494 Py_ssize_t prefix_len = 0; | |
| 1495 Py_ssize_t prefix_skip = 0; | |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1496 SRE_CODE* prefix = NULL; |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1497 SRE_CODE* charset = NULL; |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1498 SRE_CODE* overlap = NULL; |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1499 int flags = 0; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1500 |
| 13118 | 1501 if (pattern[0] == SRE_OP_INFO) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1502 /* optimization info block */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1503 /* <INFO> <1=skip> <2=flags> <3=min> <4=max> <5=prefix info> */ |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1504 |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1505 flags = pattern[2]; |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1506 |
|
29594
eaa062fdd46a
Fixing bug described in patch #756032, where SRE reads invalid data
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
29394
diff
changeset
|
1507 if (pattern[3] > 1) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1508 /* adjust end point (but make sure we leave at least one |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1509 character in there, so literal search will work) */ |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1510 end -= pattern[3]-1; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1511 if (end <= ptr) |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1512 end = ptr+1; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1513 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1514 |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1515 if (flags & SRE_INFO_PREFIX) { |
|
13308
fc2ad6fa08ec
- actually enabled charset anchors in the engine (still not
Fredrik Lundh <fredrik@pythonware.com>
parents:
13306
diff
changeset
|
1516 /* pattern starts with a known prefix */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1517 /* <length> <skip> <prefix data> <overlap data> */ |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1518 prefix_len = pattern[5]; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1519 prefix_skip = pattern[6]; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1520 prefix = pattern + 7; |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1521 overlap = prefix + prefix_len - 1; |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1522 } else if (flags & SRE_INFO_CHARSET) |
|
13308
fc2ad6fa08ec
- actually enabled charset anchors in the engine (still not
Fredrik Lundh <fredrik@pythonware.com>
parents:
13306
diff
changeset
|
1523 /* pattern starts with a character from a known set */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1524 /* <charset> */ |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1525 charset = pattern + 5; |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1526 |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1527 pattern += 1 + pattern[1]; |
| 13118 | 1528 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1529 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1530 TRACE(("prefix = %p %d %d\n", prefix, prefix_len, prefix_skip)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1531 TRACE(("charset = %p\n", charset)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1532 |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1533 #if defined(USE_FAST_SEARCH) |
|
13361
bef7b629ac95
maintenance release:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13328
diff
changeset
|
1534 if (prefix_len > 1) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1535 /* pattern starts with a known prefix. use the overlap |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1536 table to skip forward as fast as we possibly can */ |
| 38770 | 1537 Py_ssize_t i = 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1538 end = (SRE_CHAR *)state->end; |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1539 while (ptr < end) { |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1540 for (;;) { |
|
13201
a093fad92ccf
the mad patcher strikes again:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13198
diff
changeset
|
1541 if ((SRE_CODE) ptr[0] != prefix[i]) { |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1542 if (!i) |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1543 break; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1544 else |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1545 i = overlap[i]; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1546 } else { |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1547 if (++i == prefix_len) { |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1548 /* found a potential match */ |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1549 TRACE(("|%p|%p|SEARCH SCAN\n", pattern, ptr)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1550 state->start = ptr + 1 - prefix_len; |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1551 state->ptr = ptr + 1 - prefix_len + prefix_skip; |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1552 if (flags & SRE_INFO_LITERAL) |
|
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1553 return 1; /* we got all of it */ |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1554 status = SRE_MATCH(state, pattern + 2*prefix_skip); |
|
13164
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1555 if (status != 0) |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1556 return status; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1557 /* close but no cigar -- try again */ |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1558 i = overlap[i]; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1559 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1560 break; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1561 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1562 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1563 ptr++; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1564 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1565 return 0; |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1566 } |
|
6faa411c61fb
still trying to figure out how to fix the remaining
Fredrik Lundh <fredrik@pythonware.com>
parents:
13139
diff
changeset
|
1567 #endif |
|
13139
c2207d6c03a8
- fixed another split problem
Fredrik Lundh <fredrik@pythonware.com>
parents:
13136
diff
changeset
|
1568 |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1569 if (pattern[0] == SRE_OP_LITERAL) { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1570 /* pattern starts with a literal character. this is used |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1571 for short prefixes, and if fast search is disabled */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1572 SRE_CODE chr = pattern[1]; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1573 end = (SRE_CHAR *)state->end; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1574 for (;;) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1575 while (ptr < end && (SRE_CODE) ptr[0] != chr) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1576 ptr++; |
|
26090
62f88c02c987
Fixed sre bug "[#581080] Provoking infinite scanner loops".
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
26074
diff
changeset
|
1577 if (ptr >= end) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1578 return 0; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1579 TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr)); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1580 state->start = ptr; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1581 state->ptr = ++ptr; |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
1582 if (flags & SRE_INFO_LITERAL) |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
1583 return 1; /* we got all of it */ |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1584 status = SRE_MATCH(state, pattern + 2); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1585 if (status != 0) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1586 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1587 } |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1588 } else if (charset) { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1589 /* pattern starts with a character from a known set */ |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1590 end = (SRE_CHAR *)state->end; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1591 for (;;) { |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1592 while (ptr < end && !SRE_CHARSET(charset, ptr[0])) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1593 ptr++; |
|
26090
62f88c02c987
Fixed sre bug "[#581080] Provoking infinite scanner loops".
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
26074
diff
changeset
|
1594 if (ptr >= end) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1595 return 0; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1596 TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr)); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1597 state->start = ptr; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1598 state->ptr = ptr; |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1599 status = SRE_MATCH(state, pattern); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1600 if (status != 0) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1601 break; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1602 ptr++; |
|
13306
384fa9b9e253
-- use charset bitmaps where appropriate. this gives a 5-10%
Fredrik Lundh <fredrik@pythonware.com>
parents:
13305
diff
changeset
|
1603 } |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1604 } else |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1605 /* general case */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1606 while (ptr <= end) { |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1607 TRACE(("|%p|%p|SEARCH\n", pattern, ptr)); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1608 state->start = state->ptr = ptr++; |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1609 status = SRE_MATCH(state, pattern); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1610 if (status != 0) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1611 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1612 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1613 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1614 return status; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1615 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
1616 |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1617 LOCAL(int) |
| 38770 | 1618 SRE_LITERAL_TEMPLATE(SRE_CHAR* ptr, Py_ssize_t len) |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1619 { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1620 /* check if given string is a literal template (i.e. no escapes) */ |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1621 while (len-- > 0) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1622 if (*ptr++ == '\\') |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1623 return 0; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1624 return 1; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1625 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1626 |
| 13118 | 1627 #if !defined(SRE_RECURSIVE) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1628 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1629 /* -------------------------------------------------------------------- */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1630 /* factories and destructors */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1631 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1632 /* see sre.h for object declarations */ |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1633 static PyObject*pattern_new_match(PatternObject*, SRE_STATE*, int); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
1634 static PyObject*pattern_scanner(PatternObject*, PyObject*); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1635 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1636 static PyObject * |
|
38475
9f3284c92eb3
METH_NOARGS functions do get called with two args.
Georg Brandl <georg@python.org>
parents:
38473
diff
changeset
|
1637 sre_codesize(PyObject* self, PyObject *unused) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1638 { |
| 38770 | 1639 return Py_BuildValue("l", sizeof(SRE_CODE)); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1640 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1641 |
| 13118 | 1642 static PyObject * |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1643 sre_getlower(PyObject* self, PyObject* args) |
| 13118 | 1644 { |
| 1645 int character, flags; | |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1646 if (!PyArg_ParseTuple(args, "ii", &character, &flags)) |
| 13118 | 1647 return NULL; |
| 1648 if (flags & SRE_FLAG_LOCALE) | |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1649 return Py_BuildValue("i", sre_lower_locale(character)); |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1650 if (flags & SRE_FLAG_UNICODE) |
| 13118 | 1651 #if defined(HAVE_UNICODE) |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1652 return Py_BuildValue("i", sre_lower_unicode(character)); |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1653 #else |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1654 return Py_BuildValue("i", sre_lower_locale(character)); |
| 13118 | 1655 #endif |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1656 return Py_BuildValue("i", sre_lower(character)); |
| 13118 | 1657 } |
| 1658 | |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1659 LOCAL(void) |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1660 state_reset(SRE_STATE* state) |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1661 { |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1662 /* FIXME: dynamic! */ |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1663 /*memset(state->mark, 0, sizeof(*state->mark) * SRE_MARK_SIZE);*/ |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1664 |
|
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1665 state->lastmark = -1; |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1666 state->lastindex = -1; |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1667 |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1668 state->repeat = NULL; |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1669 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1670 data_stack_dealloc(state); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1671 } |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1672 |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1673 static void* |
| 38770 | 1674 getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1675 { |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1676 /* given a python object, return a data pointer, a length (in |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1677 characters), and a character size. return NULL if the object |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1678 is not a string (or not compatible) */ |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
1679 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1680 PyBufferProcs *buffer; |
| 38770 | 1681 Py_ssize_t size, bytes; |
| 1682 int charsize; | |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1683 void* ptr; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1684 |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1685 #if defined(HAVE_UNICODE) |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1686 if (PyUnicode_Check(string)) { |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1687 /* unicode strings doesn't always support the buffer interface */ |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1688 ptr = (void*) PyUnicode_AS_DATA(string); |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1689 bytes = PyUnicode_GET_DATA_SIZE(string); |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1690 size = PyUnicode_GET_SIZE(string); |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1691 charsize = sizeof(Py_UNICODE); |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1692 |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1693 } else { |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1694 #endif |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1695 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1696 /* get pointer to string buffer */ |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
43326
diff
changeset
|
1697 buffer = Py_TYPE(string)->tp_as_buffer; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1698 if (!buffer || !buffer->bf_getreadbuffer || !buffer->bf_getsegcount || |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1699 buffer->bf_getsegcount(string, NULL) != 1) { |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1700 PyErr_SetString(PyExc_TypeError, "expected string or buffer"); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1701 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1702 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1703 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1704 /* determine buffer size */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1705 bytes = buffer->bf_getreadbuffer(string, 0, &ptr); |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1706 if (bytes < 0) { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1707 PyErr_SetString(PyExc_TypeError, "buffer has negative size"); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1708 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1709 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1710 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1711 /* determine character size */ |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1712 #if PY_VERSION_HEX >= 0x01060000 |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1713 size = PyObject_Size(string); |
| 13118 | 1714 #else |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1715 size = PyObject_Length(string); |
| 13118 | 1716 #endif |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1717 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1718 if (PyString_Check(string) || bytes == size) |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1719 charsize = 1; |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1720 #if defined(HAVE_UNICODE) |
| 38770 | 1721 else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE))) |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1722 charsize = sizeof(Py_UNICODE); |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1723 #endif |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1724 else { |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1725 PyErr_SetString(PyExc_TypeError, "buffer size mismatch"); |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1726 return NULL; |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
1727 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1728 |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1729 #if defined(HAVE_UNICODE) |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1730 } |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1731 #endif |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
1732 |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1733 *p_length = size; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1734 *p_charsize = charsize; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1735 |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1736 return ptr; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1737 } |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1738 |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1739 LOCAL(PyObject*) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1740 state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, |
| 38770 | 1741 Py_ssize_t start, Py_ssize_t end) |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1742 { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1743 /* prepare state object */ |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1744 |
| 38770 | 1745 Py_ssize_t length; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1746 int charsize; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1747 void* ptr; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1748 |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1749 memset(state, 0, sizeof(SRE_STATE)); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1750 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1751 state->lastmark = -1; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1752 state->lastindex = -1; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1753 |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1754 ptr = getstring(string, &length, &charsize); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1755 if (!ptr) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1756 return NULL; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1757 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1758 /* adjust boundaries */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1759 if (start < 0) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1760 start = 0; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1761 else if (start > length) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1762 start = length; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1763 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1764 if (end < 0) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1765 end = 0; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1766 else if (end > length) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1767 end = length; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1768 |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
1769 state->charsize = charsize; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1770 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1771 state->beginning = ptr; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1772 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1773 state->start = (void*) ((char*) ptr + start * state->charsize); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1774 state->end = (void*) ((char*) ptr + end * state->charsize); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1775 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1776 Py_INCREF(string); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1777 state->string = string; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1778 state->pos = start; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1779 state->endpos = end; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1780 |
| 13118 | 1781 if (pattern->flags & SRE_FLAG_LOCALE) |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1782 state->lower = sre_lower_locale; |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1783 else if (pattern->flags & SRE_FLAG_UNICODE) |
| 13118 | 1784 #if defined(HAVE_UNICODE) |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1785 state->lower = sre_lower_unicode; |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1786 #else |
|
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
1787 state->lower = sre_lower_locale; |
| 13118 | 1788 #endif |
| 1789 else | |
|
13124
5021db674019
- renamed "tolower" hook (it happened to work with
Fredrik Lundh <fredrik@pythonware.com>
parents:
13121
diff
changeset
|
1790 state->lower = sre_lower; |
| 13118 | 1791 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1792 return string; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1793 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1794 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1795 LOCAL(void) |
|
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1796 state_fini(SRE_STATE* state) |
|
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1797 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1798 Py_XDECREF(state->string); |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1799 data_stack_dealloc(state); |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1800 } |
|
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1801 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1802 /* calculate offset from start of string */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1803 #define STATE_OFFSET(state, member)\ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1804 (((char*)(member) - (char*)(state)->beginning) / (state)->charsize) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1805 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1806 LOCAL(PyObject*) |
| 38770 | 1807 state_getslice(SRE_STATE* state, Py_ssize_t index, PyObject* string, int empty) |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1808 { |
| 38770 | 1809 Py_ssize_t i, j; |
|
13898
d3bf97d532a0
-- changed findall to return empty strings instead of None
Fredrik Lundh <fredrik@pythonware.com>
parents:
13888
diff
changeset
|
1810 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1811 index = (index - 1) * 2; |
|
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1812 |
|
30703
8282aa1f9343
Implemented non-recursive SRE matching.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30683
diff
changeset
|
1813 if (string == Py_None || index >= state->lastmark || !state->mark[index] || !state->mark[index+1]) { |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1814 if (empty) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1815 /* want empty string */ |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1816 i = j = 0; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1817 else { |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1818 Py_INCREF(Py_None); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1819 return Py_None; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
1820 } |
|
13898
d3bf97d532a0
-- changed findall to return empty strings instead of None
Fredrik Lundh <fredrik@pythonware.com>
parents:
13888
diff
changeset
|
1821 } else { |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1822 i = STATE_OFFSET(state, state->mark[index]); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1823 j = STATE_OFFSET(state, state->mark[index+1]); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1824 } |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1825 |
|
13898
d3bf97d532a0
-- changed findall to return empty strings instead of None
Fredrik Lundh <fredrik@pythonware.com>
parents:
13888
diff
changeset
|
1826 return PySequence_GetSlice(string, i, j); |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1827 } |
|
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1828 |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1829 static void |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1830 pattern_error(int status) |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1831 { |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1832 switch (status) { |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1833 case SRE_ERROR_RECURSION_LIMIT: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1834 PyErr_SetString( |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1835 PyExc_RuntimeError, |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1836 "maximum recursion limit exceeded" |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1837 ); |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1838 break; |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1839 case SRE_ERROR_MEMORY: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1840 PyErr_NoMemory(); |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1841 break; |
|
44602
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
1842 case SRE_ERROR_INTERRUPTED: |
|
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
1843 /* An exception has already been raised, so let it fly */ |
|
47e78c2d16de
Issue 846388. Adds a call to PyErr_CheckSignals to
Facundo Batista <facundobatista@gmail.com>
parents:
44350
diff
changeset
|
1844 break; |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1845 default: |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1846 /* other error codes indicate compiler/engine bugs */ |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1847 PyErr_SetString( |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1848 PyExc_RuntimeError, |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1849 "internal error in regular expression engine" |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1850 ); |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1851 } |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1852 } |
|
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
1853 |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1854 static void |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
1855 pattern_dealloc(PatternObject* self) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1856 { |
|
32160
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
1857 if (self->weakreflist != NULL) |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
1858 PyObject_ClearWeakRefs((PyObject *) self); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1859 Py_XDECREF(self->pattern); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1860 Py_XDECREF(self->groupindex); |
|
15906
50890e3454c9
fixed a memory leak in pattern cleanup (patch #103248 by cgw)
Fredrik Lundh <fredrik@pythonware.com>
parents:
15877
diff
changeset
|
1861 Py_XDECREF(self->indexgroup); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1862 PyObject_DEL(self); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1863 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1864 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1865 static PyObject* |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
1866 pattern_match(PatternObject* self, PyObject* args, PyObject* kw) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1867 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1868 SRE_STATE state; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1869 int status; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1870 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1871 PyObject* string; |
| 38770 | 1872 Py_ssize_t start = 0; |
| 1873 Py_ssize_t end = PY_SSIZE_T_MAX; | |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
1874 static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; |
| 38770 | 1875 if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:match", kwlist, |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
1876 &string, &start, &end)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1877 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1878 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1879 string = state_init(&state, self, string, start, end); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1880 if (!string) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1881 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1882 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1883 state.ptr = state.start; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1884 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1885 TRACE(("|%p|%p|MATCH\n", PatternObject_GetCode(self), state.ptr)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1886 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1887 if (state.charsize == 1) { |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1888 status = sre_match(&state, PatternObject_GetCode(self)); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1889 } else { |
| 13118 | 1890 #if defined(HAVE_UNICODE) |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
1891 status = sre_umatch(&state, PatternObject_GetCode(self)); |
| 13118 | 1892 #endif |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1893 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1894 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1895 TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1896 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1897 return NULL; |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1898 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1899 state_fini(&state); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1900 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1901 return pattern_new_match(self, &state, status); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1902 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1903 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1904 static PyObject* |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
1905 pattern_search(PatternObject* self, PyObject* args, PyObject* kw) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1906 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1907 SRE_STATE state; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1908 int status; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1909 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1910 PyObject* string; |
| 38770 | 1911 Py_ssize_t start = 0; |
| 1912 Py_ssize_t end = PY_SSIZE_T_MAX; | |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
1913 static char* kwlist[] = { "pattern", "pos", "endpos", NULL }; |
| 38770 | 1914 if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:search", kwlist, |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
1915 &string, &start, &end)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1916 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1917 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1918 string = state_init(&state, self, string, start, end); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1919 if (!string) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1920 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1921 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1922 TRACE(("|%p|%p|SEARCH\n", PatternObject_GetCode(self), state.ptr)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1923 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1924 if (state.charsize == 1) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1925 status = sre_search(&state, PatternObject_GetCode(self)); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1926 } else { |
| 13118 | 1927 #if defined(HAVE_UNICODE) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1928 status = sre_usearch(&state, PatternObject_GetCode(self)); |
| 13118 | 1929 #endif |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1930 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1931 |
|
13886
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1932 TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); |
|
62494a96dcca
-- reset marks if repeat_one tail doesn't match
Fredrik Lundh <fredrik@pythonware.com>
parents:
13882
diff
changeset
|
1933 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1934 state_fini(&state); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1935 |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1936 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1937 return NULL; |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
1938 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
1939 return pattern_new_match(self, &state, status); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1940 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1941 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1942 static PyObject* |
| 18373 | 1943 call(char* module, char* function, PyObject* args) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1944 { |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1945 PyObject* name; |
| 18373 | 1946 PyObject* mod; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1947 PyObject* func; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1948 PyObject* result; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1949 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1950 if (!args) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1951 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1952 name = PyString_FromString(module); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1953 if (!name) |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1954 return NULL; |
| 18373 | 1955 mod = PyImport_Import(name); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1956 Py_DECREF(name); |
| 18373 | 1957 if (!mod) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1958 return NULL; |
| 18373 | 1959 func = PyObject_GetAttrString(mod, function); |
| 1960 Py_DECREF(mod); | |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1961 if (!func) |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1962 return NULL; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1963 result = PyObject_CallObject(func, args); |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1964 Py_DECREF(func); |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1965 Py_DECREF(args); |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1966 return result; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1967 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1968 |
| 18373 | 1969 #ifdef USE_BUILTIN_COPY |
| 1970 static int | |
| 1971 deepcopy(PyObject** object, PyObject* memo) | |
| 1972 { | |
| 1973 PyObject* copy; | |
| 1974 | |
| 1975 copy = call( | |
| 1976 "copy", "deepcopy", | |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
29594
diff
changeset
|
1977 PyTuple_Pack(2, *object, memo) |
| 18373 | 1978 ); |
| 1979 if (!copy) | |
| 1980 return 0; | |
| 1981 | |
| 1982 Py_DECREF(*object); | |
| 1983 *object = copy; | |
| 1984 | |
| 1985 return 1; /* success */ | |
| 1986 } | |
| 1987 #endif | |
| 1988 | |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
1989 static PyObject* |
|
43326
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
1990 join_list(PyObject* list, PyObject* string) |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1991 { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1992 /* join list elements */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1993 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1994 PyObject* joiner; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1995 #if PY_VERSION_HEX >= 0x01060000 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1996 PyObject* function; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1997 PyObject* args; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1998 #endif |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
1999 PyObject* result; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2000 |
|
43326
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2001 joiner = PySequence_GetSlice(string, 0, 0); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2002 if (!joiner) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2003 return NULL; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2004 |
|
43326
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2005 if (PyList_GET_SIZE(list) == 0) { |
|
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2006 Py_DECREF(list); |
|
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2007 return joiner; |
|
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2008 } |
|
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2009 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2010 #if PY_VERSION_HEX >= 0x01060000 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2011 function = PyObject_GetAttrString(joiner, "join"); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2012 if (!function) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2013 Py_DECREF(joiner); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2014 return NULL; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2015 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2016 args = PyTuple_New(1); |
|
20590
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2017 if (!args) { |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2018 Py_DECREF(function); |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2019 Py_DECREF(joiner); |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2020 return NULL; |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2021 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2022 PyTuple_SET_ITEM(args, 0, list); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2023 result = PyObject_CallObject(function, args); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2024 Py_DECREF(args); /* also removes list */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2025 Py_DECREF(function); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2026 #else |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2027 result = call( |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2028 "string", "join", |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
29594
diff
changeset
|
2029 PyTuple_Pack(2, list, joiner) |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2030 ); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2031 #endif |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2032 Py_DECREF(joiner); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2033 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2034 return result; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2035 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2036 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2037 static PyObject* |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
2038 pattern_findall(PatternObject* self, PyObject* args, PyObject* kw) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2039 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2040 SRE_STATE state; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2041 PyObject* list; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2042 int status; |
| 38770 | 2043 Py_ssize_t i, b, e; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2044 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2045 PyObject* string; |
| 38770 | 2046 Py_ssize_t start = 0; |
| 2047 Py_ssize_t end = PY_SSIZE_T_MAX; | |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
2048 static char* kwlist[] = { "source", "pos", "endpos", NULL }; |
| 38770 | 2049 if (!PyArg_ParseTupleAndKeywords(args, kw, "O|nn:findall", kwlist, |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
2050 &string, &start, &end)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2051 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2052 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2053 string = state_init(&state, self, string, start, end); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2054 if (!string) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2055 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2056 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2057 list = PyList_New(0); |
|
20590
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2058 if (!list) { |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2059 state_fini(&state); |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2060 return NULL; |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2061 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2062 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2063 while (state.start <= state.end) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2064 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2065 PyObject* item; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2066 |
|
15355
2a3696d32721
-- properly reset groups in findall (bug #117612)
Fredrik Lundh <fredrik@pythonware.com>
parents:
15000
diff
changeset
|
2067 state_reset(&state); |
|
2a3696d32721
-- properly reset groups in findall (bug #117612)
Fredrik Lundh <fredrik@pythonware.com>
parents:
15000
diff
changeset
|
2068 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2069 state.ptr = state.start; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2070 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2071 if (state.charsize == 1) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2072 status = sre_search(&state, PatternObject_GetCode(self)); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2073 } else { |
| 13118 | 2074 #if defined(HAVE_UNICODE) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2075 status = sre_usearch(&state, PatternObject_GetCode(self)); |
| 13118 | 2076 #endif |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2077 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2078 |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2079 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2080 goto error; |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2081 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2082 if (status <= 0) { |
| 13118 | 2083 if (status == 0) |
| 2084 break; | |
|
13829
02e0816e4b37
-- added recursion limit (currently ~10,000 levels)
Fredrik Lundh <fredrik@pythonware.com>
parents:
13795
diff
changeset
|
2085 pattern_error(status); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2086 goto error; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2087 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2088 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2089 /* don't bother to build a match object */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2090 switch (self->groups) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2091 case 0: |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2092 b = STATE_OFFSET(&state, state.start); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2093 e = STATE_OFFSET(&state, state.ptr); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2094 item = PySequence_GetSlice(string, b, e); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2095 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2096 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2097 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2098 case 1: |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2099 item = state_getslice(&state, 1, string, 1); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2100 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2101 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2102 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2103 default: |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2104 item = PyTuple_New(self->groups); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2105 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2106 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2107 for (i = 0; i < self->groups; i++) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2108 PyObject* o = state_getslice(&state, i+1, string, 1); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2109 if (!o) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2110 Py_DECREF(item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2111 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2112 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2113 PyTuple_SET_ITEM(item, i, o); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2114 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2115 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2116 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2117 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2118 status = PyList_Append(list, item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2119 Py_DECREF(item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2120 if (status < 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2121 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2122 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2123 if (state.ptr == state.start) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2124 state.start = (void*) ((char*) state.ptr + state.charsize); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2125 else |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2126 state.start = state.ptr; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2127 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2128 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2129 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2130 state_fini(&state); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2131 return list; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2132 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2133 error: |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
2134 Py_DECREF(list); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2135 state_fini(&state); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2136 return NULL; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2137 |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2138 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2139 |
|
20660
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2140 #if PY_VERSION_HEX >= 0x02020000 |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2141 static PyObject* |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2142 pattern_finditer(PatternObject* pattern, PyObject* args) |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2143 { |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2144 PyObject* scanner; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2145 PyObject* search; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2146 PyObject* iterator; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2147 |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2148 scanner = pattern_scanner(pattern, args); |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2149 if (!scanner) |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2150 return NULL; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2151 |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2152 search = PyObject_GetAttrString(scanner, "search"); |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2153 Py_DECREF(scanner); |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2154 if (!search) |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2155 return NULL; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2156 |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2157 iterator = PyCallIter_New(search, Py_None); |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2158 Py_DECREF(search); |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2159 |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2160 return iterator; |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2161 } |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2162 #endif |
|
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2163 |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2164 static PyObject* |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2165 pattern_split(PatternObject* self, PyObject* args, PyObject* kw) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2166 { |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2167 SRE_STATE state; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2168 PyObject* list; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2169 PyObject* item; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2170 int status; |
| 38770 | 2171 Py_ssize_t n; |
| 2172 Py_ssize_t i; | |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2173 void* last; |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2174 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2175 PyObject* string; |
| 38770 | 2176 Py_ssize_t maxsplit = 0; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
2177 static char* kwlist[] = { "source", "maxsplit", NULL }; |
| 38770 | 2178 if (!PyArg_ParseTupleAndKeywords(args, kw, "O|n:split", kwlist, |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2179 &string, &maxsplit)) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2180 return NULL; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2181 |
| 38770 | 2182 string = state_init(&state, self, string, 0, PY_SSIZE_T_MAX); |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2183 if (!string) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2184 return NULL; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2185 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2186 list = PyList_New(0); |
|
20590
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2187 if (!list) { |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2188 state_fini(&state); |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2189 return NULL; |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2190 } |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2191 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2192 n = 0; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2193 last = state.start; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2194 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2195 while (!maxsplit || n < maxsplit) { |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2196 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2197 state_reset(&state); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2198 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2199 state.ptr = state.start; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2200 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2201 if (state.charsize == 1) { |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2202 status = sre_search(&state, PatternObject_GetCode(self)); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2203 } else { |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2204 #if defined(HAVE_UNICODE) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2205 status = sre_usearch(&state, PatternObject_GetCode(self)); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2206 #endif |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2207 } |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2208 |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2209 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2210 goto error; |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2211 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2212 if (status <= 0) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2213 if (status == 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2214 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2215 pattern_error(status); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2216 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2217 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2218 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2219 if (state.start == state.ptr) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2220 if (last == state.end) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2221 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2222 /* skip one character */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2223 state.start = (void*) ((char*) state.ptr + state.charsize); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2224 continue; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2225 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2226 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2227 /* get segment before this match */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2228 item = PySequence_GetSlice( |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2229 string, STATE_OFFSET(&state, last), |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2230 STATE_OFFSET(&state, state.start) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2231 ); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2232 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2233 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2234 status = PyList_Append(list, item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2235 Py_DECREF(item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2236 if (status < 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2237 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2238 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2239 /* add groups (if any) */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2240 for (i = 0; i < self->groups; i++) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2241 item = state_getslice(&state, i+1, string, 0); |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2242 if (!item) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2243 goto error; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2244 status = PyList_Append(list, item); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2245 Py_DECREF(item); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2246 if (status < 0) |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2247 goto error; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2248 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2249 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2250 n = n + 1; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2251 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2252 last = state.start = state.ptr; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2253 |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2254 } |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2255 |
|
20605
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2256 /* get segment following last match (even if empty) */ |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2257 item = PySequence_GetSlice( |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2258 string, STATE_OFFSET(&state, last), state.endpos |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2259 ); |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2260 if (!item) |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2261 goto error; |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2262 status = PyList_Append(list, item); |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2263 Py_DECREF(item); |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2264 if (status < 0) |
|
73702d7f13b1
sre.split should return the last segment, even if empty
Fredrik Lundh <fredrik@pythonware.com>
parents:
20592
diff
changeset
|
2265 goto error; |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2266 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2267 state_fini(&state); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2268 return list; |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2269 |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2270 error: |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2271 Py_DECREF(list); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2272 state_fini(&state); |
|
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2273 return NULL; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2274 |
|
20585
7d1257485aef
rewrote the pattern.split method in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20534
diff
changeset
|
2275 } |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2276 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2277 static PyObject* |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2278 pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, |
| 38770 | 2279 Py_ssize_t count, Py_ssize_t subn) |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2280 { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2281 SRE_STATE state; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2282 PyObject* list; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2283 PyObject* item; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2284 PyObject* filter; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2285 PyObject* args; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2286 PyObject* match; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2287 void* ptr; |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2288 int status; |
| 38770 | 2289 Py_ssize_t n; |
| 2290 Py_ssize_t i, b, e; | |
| 2291 int bint; | |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2292 int filter_is_callable; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2293 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2294 if (PyCallable_Check(ptemplate)) { |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2295 /* sub/subn takes either a function or a template */ |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2296 filter = ptemplate; |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2297 Py_INCREF(filter); |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2298 filter_is_callable = 1; |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2299 } else { |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2300 /* if not callable, check if it's a literal string */ |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2301 int literal; |
| 38770 | 2302 ptr = getstring(ptemplate, &n, &bint); |
| 2303 b = bint; | |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2304 if (ptr) { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2305 if (b == 1) { |
|
37833
ee90ab26086a
C++ compiler cleanup: proper casts
Skip Montanaro <skip@pobox.com>
parents:
37617
diff
changeset
|
2306 literal = sre_literal_template((unsigned char *)ptr, n); |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2307 } else { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2308 #if defined(HAVE_UNICODE) |
|
37833
ee90ab26086a
C++ compiler cleanup: proper casts
Skip Montanaro <skip@pobox.com>
parents:
37617
diff
changeset
|
2309 literal = sre_uliteral_template((Py_UNICODE *)ptr, n); |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2310 #endif |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2311 } |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2312 } else { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2313 PyErr_Clear(); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2314 literal = 0; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2315 } |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2316 if (literal) { |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2317 filter = ptemplate; |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2318 Py_INCREF(filter); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2319 filter_is_callable = 0; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2320 } else { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2321 /* not a literal; hand it over to the template compiler */ |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2322 filter = call( |
| 37017 | 2323 SRE_PY_MODULE, "_subx", |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2324 PyTuple_Pack(2, self, ptemplate) |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2325 ); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2326 if (!filter) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2327 return NULL; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2328 filter_is_callable = PyCallable_Check(filter); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2329 } |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2330 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2331 |
| 38770 | 2332 string = state_init(&state, self, string, 0, PY_SSIZE_T_MAX); |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2333 if (!string) { |
|
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2334 Py_DECREF(filter); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2335 return NULL; |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2336 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2337 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2338 list = PyList_New(0); |
|
20590
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2339 if (!list) { |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2340 Py_DECREF(filter); |
|
20590
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2341 state_fini(&state); |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2342 return NULL; |
|
050ed8a21cde
sre.Scanner fixes (from Greg Chapman). also added a Scanner sanity
Fredrik Lundh <fredrik@pythonware.com>
parents:
20589
diff
changeset
|
2343 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2344 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2345 n = i = 0; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2346 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2347 while (!count || n < count) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2348 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2349 state_reset(&state); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2350 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2351 state.ptr = state.start; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2352 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2353 if (state.charsize == 1) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2354 status = sre_search(&state, PatternObject_GetCode(self)); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2355 } else { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2356 #if defined(HAVE_UNICODE) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2357 status = sre_usearch(&state, PatternObject_GetCode(self)); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2358 #endif |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2359 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2360 |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2361 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2362 goto error; |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
2363 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2364 if (status <= 0) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2365 if (status == 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2366 break; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2367 pattern_error(status); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2368 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2369 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2370 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2371 b = STATE_OFFSET(&state, state.start); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2372 e = STATE_OFFSET(&state, state.ptr); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2373 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2374 if (i < b) { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2375 /* get segment before this match */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2376 item = PySequence_GetSlice(string, i, b); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2377 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2378 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2379 status = PyList_Append(list, item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2380 Py_DECREF(item); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2381 if (status < 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2382 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2383 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2384 } else if (i == b && i == e && n > 0) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2385 /* ignore empty match on latest position */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2386 goto next; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2387 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2388 if (filter_is_callable) { |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2389 /* pass match object through filter */ |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2390 match = pattern_new_match(self, &state, 1); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2391 if (!match) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2392 goto error; |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
29594
diff
changeset
|
2393 args = PyTuple_Pack(1, match); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2394 if (!args) { |
|
21282
d35a5771c4c6
Fix for #489672 (Neil Norwitz): memory leak in test_sre.
Guido van Rossum <guido@python.org>
parents:
20660
diff
changeset
|
2395 Py_DECREF(match); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2396 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2397 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2398 item = PyObject_CallObject(filter, args); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2399 Py_DECREF(args); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2400 Py_DECREF(match); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2401 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2402 goto error; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2403 } else { |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2404 /* filter is literal string */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2405 item = filter; |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2406 Py_INCREF(item); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2407 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2408 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2409 /* add to list */ |
|
20620
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2410 if (item != Py_None) { |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2411 status = PyList_Append(list, item); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2412 Py_DECREF(item); |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2413 if (status < 0) |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2414 goto error; |
|
e4f5138292e6
another major speedup: let sre.sub/subn check for escapes in the
Fredrik Lundh <fredrik@pythonware.com>
parents:
20605
diff
changeset
|
2415 } |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2416 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2417 i = e; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2418 n = n + 1; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2419 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2420 next: |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2421 /* move on */ |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2422 if (state.ptr == state.start) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2423 state.start = (void*) ((char*) state.ptr + state.charsize); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2424 else |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2425 state.start = state.ptr; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2426 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2427 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2428 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2429 /* get segment following last match */ |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2430 if (i < state.endpos) { |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2431 item = PySequence_GetSlice(string, i, state.endpos); |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2432 if (!item) |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2433 goto error; |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2434 status = PyList_Append(list, item); |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2435 Py_DECREF(item); |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2436 if (status < 0) |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2437 goto error; |
|
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2438 } |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2439 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2440 state_fini(&state); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2441 |
|
21282
d35a5771c4c6
Fix for #489672 (Neil Norwitz): memory leak in test_sre.
Guido van Rossum <guido@python.org>
parents:
20660
diff
changeset
|
2442 Py_DECREF(filter); |
|
d35a5771c4c6
Fix for #489672 (Neil Norwitz): memory leak in test_sre.
Guido van Rossum <guido@python.org>
parents:
20660
diff
changeset
|
2443 |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2444 /* convert list to single string (also removes list) */ |
|
43326
1dad58e00c3a
Patch # 1140 (my code, approved by Effbot).
Guido van Rossum <guido@python.org>
parents:
42333
diff
changeset
|
2445 item = join_list(list, string); |
|
20592
82bcfac89642
fixed character set description in docstring (SRE uses Python
Fredrik Lundh <fredrik@pythonware.com>
parents:
20590
diff
changeset
|
2446 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2447 if (!item) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2448 return NULL; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2449 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2450 if (subn) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2451 return Py_BuildValue("Ni", item, n); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2452 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2453 return item; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2454 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2455 error: |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2456 Py_DECREF(list); |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2457 state_fini(&state); |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2458 Py_DECREF(filter); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2459 return NULL; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2460 |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2461 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2462 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2463 static PyObject* |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2464 pattern_sub(PatternObject* self, PyObject* args, PyObject* kw) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2465 { |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2466 PyObject* ptemplate; |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2467 PyObject* string; |
| 38770 | 2468 Py_ssize_t count = 0; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
2469 static char* kwlist[] = { "repl", "string", "count", NULL }; |
| 38770 | 2470 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|n:sub", kwlist, |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2471 &ptemplate, &string, &count)) |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2472 return NULL; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2473 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2474 return pattern_subx(self, ptemplate, string, count, 0); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2475 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2476 |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2477 static PyObject* |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2478 pattern_subn(PatternObject* self, PyObject* args, PyObject* kw) |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2479 { |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2480 PyObject* ptemplate; |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2481 PyObject* string; |
| 38770 | 2482 Py_ssize_t count = 0; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
2483 static char* kwlist[] = { "repl", "string", "count", NULL }; |
| 38770 | 2484 if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|n:subn", kwlist, |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2485 &ptemplate, &string, &count)) |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2486 return NULL; |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2487 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2488 return pattern_subx(self, ptemplate, string, count, 1); |
|
20589
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2489 } |
|
d3298435d85b
rewrote the pattern.sub and pattern.subn methods in C
Fredrik Lundh <fredrik@pythonware.com>
parents:
20585
diff
changeset
|
2490 |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2491 static PyObject* |
|
38475
9f3284c92eb3
METH_NOARGS functions do get called with two args.
Georg Brandl <georg@python.org>
parents:
38473
diff
changeset
|
2492 pattern_copy(PatternObject* self, PyObject *unused) |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2493 { |
| 18373 | 2494 #ifdef USE_BUILTIN_COPY |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2495 PatternObject* copy; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2496 int offset; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2497 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2498 copy = PyObject_NEW_VAR(PatternObject, &Pattern_Type, self->codesize); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2499 if (!copy) |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2500 return NULL; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2501 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2502 offset = offsetof(PatternObject, groups); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2503 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2504 Py_XINCREF(self->groupindex); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2505 Py_XINCREF(self->indexgroup); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2506 Py_XINCREF(self->pattern); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2507 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2508 memcpy((char*) copy + offset, (char*) self + offset, |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2509 sizeof(PatternObject) + self->codesize * sizeof(SRE_CODE) - offset); |
|
32160
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2510 copy->weakreflist = NULL; |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2511 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2512 return (PyObject*) copy; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2513 #else |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2514 PyErr_SetString(PyExc_TypeError, "cannot copy this pattern object"); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2515 return NULL; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2516 #endif |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2517 } |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2518 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2519 static PyObject* |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
2520 pattern_deepcopy(PatternObject* self, PyObject* memo) |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2521 { |
| 18373 | 2522 #ifdef USE_BUILTIN_COPY |
| 2523 PatternObject* copy; | |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2524 |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
2525 copy = (PatternObject*) pattern_copy(self); |
| 18373 | 2526 if (!copy) |
| 2527 return NULL; | |
| 2528 | |
| 2529 if (!deepcopy(©->groupindex, memo) || | |
| 2530 !deepcopy(©->indexgroup, memo) || | |
| 2531 !deepcopy(©->pattern, memo)) { | |
| 2532 Py_DECREF(copy); | |
| 2533 return NULL; | |
| 2534 } | |
| 2535 | |
| 2536 #else | |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2537 PyErr_SetString(PyExc_TypeError, "cannot deepcopy this pattern object"); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2538 return NULL; |
| 18373 | 2539 #endif |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2540 } |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
2541 |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2542 PyDoc_STRVAR(pattern_match_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2543 "match(string[, pos[, endpos]]) --> match object or None.\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2544 Matches zero or more characters at the beginning of the string"); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2545 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2546 PyDoc_STRVAR(pattern_search_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2547 "search(string[, pos[, endpos]]) --> match object or None.\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2548 Scan through string looking for a match, and return a corresponding\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2549 MatchObject instance. Return None if no position in the string matches."); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2550 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2551 PyDoc_STRVAR(pattern_split_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2552 "split(string[, maxsplit = 0]) --> list.\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2553 Split string by the occurrences of pattern."); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2554 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2555 PyDoc_STRVAR(pattern_findall_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2556 "findall(string[, pos[, endpos]]) --> list.\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2557 Return a list of all non-overlapping matches of pattern in string."); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2558 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2559 PyDoc_STRVAR(pattern_finditer_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2560 "finditer(string[, pos[, endpos]]) --> iterator.\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2561 Return an iterator over all non-overlapping matches for the \n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2562 RE pattern in string. For each match, the iterator returns a\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2563 match object."); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2564 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2565 PyDoc_STRVAR(pattern_sub_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2566 "sub(repl, string[, count = 0]) --> newstring\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2567 Return the string obtained by replacing the leftmost non-overlapping\n\ |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2568 occurrences of pattern in string by the replacement repl."); |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2569 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2570 PyDoc_STRVAR(pattern_subn_doc, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2571 "subn(repl, string[, count = 0]) --> (newstring, number of subs)\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2572 Return the tuple (new_string, number_of_subs_made) found by replacing\n\ |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2573 the leftmost non-overlapping occurrences of pattern with the\n\ |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2574 replacement repl."); |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2575 |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2576 PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects"); |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2577 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
2578 static PyMethodDef pattern_methods[] = { |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2579 {"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS, |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2580 pattern_match_doc}, |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2581 {"search", (PyCFunction) pattern_search, METH_VARARGS|METH_KEYWORDS, |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2582 pattern_search_doc}, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2583 {"sub", (PyCFunction) pattern_sub, METH_VARARGS|METH_KEYWORDS, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2584 pattern_sub_doc}, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2585 {"subn", (PyCFunction) pattern_subn, METH_VARARGS|METH_KEYWORDS, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2586 pattern_subn_doc}, |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2587 {"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS, |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2588 pattern_split_doc}, |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2589 {"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS, |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2590 pattern_findall_doc}, |
|
20660
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2591 #if PY_VERSION_HEX >= 0x02020000 |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2592 {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS, |
|
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2593 pattern_finditer_doc}, |
|
20660
c05d4895234c
(experimental) "finditer" method/function. this works pretty much
Fredrik Lundh <fredrik@pythonware.com>
parents:
20620
diff
changeset
|
2594 #endif |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
2595 {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS}, |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
2596 {"__copy__", (PyCFunction) pattern_copy, METH_NOARGS}, |
|
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
2597 {"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_O}, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2598 {NULL, NULL} |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2599 }; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2600 |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
2601 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
2602 pattern_getattr(PatternObject* self, char* name) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2603 { |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2604 PyObject* res; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2605 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2606 res = Py_FindMethod(pattern_methods, (PyObject*) self, name); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2607 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2608 if (res) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2609 return res; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2610 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2611 PyErr_Clear(); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2612 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2613 /* attributes */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2614 if (!strcmp(name, "pattern")) { |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2615 Py_INCREF(self->pattern); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2616 return self->pattern; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2617 } |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2618 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2619 if (!strcmp(name, "flags")) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2620 return Py_BuildValue("i", self->flags); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2621 |
|
13166
023a2018b96d
- fixed split behaviour on empty matches
Fredrik Lundh <fredrik@pythonware.com>
parents:
13164
diff
changeset
|
2622 if (!strcmp(name, "groups")) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2623 return Py_BuildValue("i", self->groups); |
|
13166
023a2018b96d
- fixed split behaviour on empty matches
Fredrik Lundh <fredrik@pythonware.com>
parents:
13164
diff
changeset
|
2624 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2625 if (!strcmp(name, "groupindex") && self->groupindex) { |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2626 Py_INCREF(self->groupindex); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2627 return self->groupindex; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2628 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
2629 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2630 PyErr_SetString(PyExc_AttributeError, name); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2631 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2632 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2633 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2634 statichere PyTypeObject Pattern_Type = { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2635 PyObject_HEAD_INIT(NULL) |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
2636 0, "_" SRE_MODULE ".SRE_Pattern", |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
2637 sizeof(PatternObject), sizeof(SRE_CODE), |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2638 (destructor)pattern_dealloc, /*tp_dealloc*/ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
2639 0, /*tp_print*/ |
|
32160
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2640 (getattrfunc)pattern_getattr, /*tp_getattr*/ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2641 0, /* tp_setattr */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2642 0, /* tp_compare */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2643 0, /* tp_repr */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2644 0, /* tp_as_number */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2645 0, /* tp_as_sequence */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2646 0, /* tp_as_mapping */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2647 0, /* tp_hash */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2648 0, /* tp_call */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2649 0, /* tp_str */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2650 0, /* tp_getattro */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2651 0, /* tp_setattro */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2652 0, /* tp_as_buffer */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2653 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */ |
|
33553
a6dc176c5d12
Add docstrings for regular expression objects and methods.
Raymond Hettinger <python@rcn.com>
parents:
33398
diff
changeset
|
2654 pattern_doc, /* tp_doc */ |
|
32160
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2655 0, /* tp_traverse */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2656 0, /* tp_clear */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2657 0, /* tp_richcompare */ |
|
aec9c98a47d2
Add weakref support to sockets and re pattern objects.
Raymond Hettinger <python@rcn.com>
parents:
31525
diff
changeset
|
2658 offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2659 }; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2660 |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2661 static int _validate(PatternObject *self); /* Forward */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2662 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2663 static PyObject * |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2664 _compile(PyObject* self_, PyObject* args) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2665 { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2666 /* "compile" pattern descriptor to pattern object */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2667 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2668 PatternObject* self; |
| 38770 | 2669 Py_ssize_t i, n; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2670 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2671 PyObject* pattern; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2672 int flags = 0; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2673 PyObject* code; |
| 38770 | 2674 Py_ssize_t groups = 0; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2675 PyObject* groupindex = NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2676 PyObject* indexgroup = NULL; |
| 38770 | 2677 if (!PyArg_ParseTuple(args, "OiO!|nOO", &pattern, &flags, |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2678 &PyList_Type, &code, &groups, |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2679 &groupindex, &indexgroup)) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2680 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2681 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2682 n = PyList_GET_SIZE(code); |
|
44749
55ddb166f1d1
Silence Coverity false alerts with CIDs #172, #183, #184
Christian Heimes <christian@cheimes.de>
parents:
44602
diff
changeset
|
2683 /* coverity[ampersand_in_size] */ |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2684 self = PyObject_NEW_VAR(PatternObject, &Pattern_Type, n); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2685 if (!self) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2686 return NULL; |
|
58326
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
2687 self->weakreflist = NULL; |
|
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
2688 self->pattern = NULL; |
|
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
2689 self->groupindex = NULL; |
|
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
2690 self->indexgroup = NULL; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2691 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2692 self->codesize = n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2693 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2694 for (i = 0; i < n; i++) { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2695 PyObject *o = PyList_GET_ITEM(code, i); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2696 unsigned long value = PyInt_Check(o) ? (unsigned long)PyInt_AsLong(o) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2697 : PyLong_AsUnsignedLong(o); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2698 self->code[i] = (SRE_CODE) value; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2699 if ((unsigned long) self->code[i] != value) { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2700 PyErr_SetString(PyExc_OverflowError, |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2701 "regular expression code size limit exceeded"); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2702 break; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2703 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2704 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2705 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2706 if (PyErr_Occurred()) { |
|
58326
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
2707 Py_DECREF(self); |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2708 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2709 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2710 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2711 Py_INCREF(pattern); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2712 self->pattern = pattern; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2713 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2714 self->flags = flags; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2715 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2716 self->groups = groups; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2717 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2718 Py_XINCREF(groupindex); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2719 self->groupindex = groupindex; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2720 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2721 Py_XINCREF(indexgroup); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2722 self->indexgroup = indexgroup; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2723 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2724 self->weakreflist = NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2725 |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2726 if (!_validate(self)) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2727 Py_DECREF(self); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2728 return NULL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2729 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2730 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2731 return (PyObject*) self; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2732 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
2733 |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2734 /* -------------------------------------------------------------------- */ |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2735 /* Code validation */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2736 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2737 /* To learn more about this code, have a look at the _compile() function in |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2738 Lib/sre_compile.py. The validation functions below checks the code array |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2739 for conformance with the code patterns generated there. |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2740 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2741 The nice thing about the generated code is that it is position-independent: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2742 all jumps are relative jumps forward. Also, jumps don't cross each other: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2743 the target of a later jump is always earlier than the target of an earlier |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2744 jump. IOW, this is okay: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2745 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2746 J---------J-------T--------T |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2747 \ \_____/ / |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2748 \______________________/ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2749 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2750 but this is not: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2751 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2752 J---------J-------T--------T |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2753 \_________\_____/ / |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2754 \____________/ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2755 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2756 It also helps that SRE_CODE is always an unsigned type, either 2 bytes or 4 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2757 bytes wide (the latter if Python is compiled for "wide" unicode support). |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2758 */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2759 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2760 /* Defining this one enables tracing of the validator */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2761 #undef VVERBOSE |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2762 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2763 /* Trace macro for the validator */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2764 #if defined(VVERBOSE) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2765 #define VTRACE(v) printf v |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2766 #else |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2767 #define VTRACE(v) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2768 #endif |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2769 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2770 /* Report failure */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2771 #define FAIL do { VTRACE(("FAIL: %d\n", __LINE__)); return 0; } while (0) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2772 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2773 /* Extract opcode, argument, or skip count from code array */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2774 #define GET_OP \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2775 do { \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2776 VTRACE(("%p: ", code)); \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2777 if (code >= end) FAIL; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2778 op = *code++; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2779 VTRACE(("%lu (op)\n", (unsigned long)op)); \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2780 } while (0) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2781 #define GET_ARG \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2782 do { \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2783 VTRACE(("%p= ", code)); \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2784 if (code >= end) FAIL; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2785 arg = *code++; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2786 VTRACE(("%lu (arg)\n", (unsigned long)arg)); \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2787 } while (0) |
|
49126
95ac698358ab
- Issue #3629: Fix sre "bytecode" validator for an end case.
Guido van Rossum <guido@python.org>
parents:
48185
diff
changeset
|
2788 #define GET_SKIP_ADJ(adj) \ |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2789 do { \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2790 VTRACE(("%p= ", code)); \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2791 if (code >= end) FAIL; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2792 skip = *code; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2793 VTRACE(("%lu (skip to %p)\n", \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2794 (unsigned long)skip, code+skip)); \ |
|
49126
95ac698358ab
- Issue #3629: Fix sre "bytecode" validator for an end case.
Guido van Rossum <guido@python.org>
parents:
48185
diff
changeset
|
2795 if (code+skip-adj < code || code+skip-adj > end)\ |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2796 FAIL; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2797 code++; \ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2798 } while (0) |
|
49126
95ac698358ab
- Issue #3629: Fix sre "bytecode" validator for an end case.
Guido van Rossum <guido@python.org>
parents:
48185
diff
changeset
|
2799 #define GET_SKIP GET_SKIP_ADJ(0) |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2800 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2801 static int |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2802 _validate_charset(SRE_CODE *code, SRE_CODE *end) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2803 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2804 /* Some variables are manipulated by the macros above */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2805 SRE_CODE op; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2806 SRE_CODE arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2807 SRE_CODE offset; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2808 int i; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2809 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2810 while (code < end) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2811 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2812 switch (op) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2813 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2814 case SRE_OP_NEGATE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2815 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2816 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2817 case SRE_OP_LITERAL: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2818 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2819 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2820 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2821 case SRE_OP_RANGE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2822 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2823 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2824 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2825 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2826 case SRE_OP_CHARSET: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2827 offset = 32/sizeof(SRE_CODE); /* 32-byte bitmap */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2828 if (code+offset < code || code+offset > end) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2829 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2830 code += offset; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2831 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2832 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2833 case SRE_OP_BIGCHARSET: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2834 GET_ARG; /* Number of blocks */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2835 offset = 256/sizeof(SRE_CODE); /* 256-byte table */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2836 if (code+offset < code || code+offset > end) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2837 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2838 /* Make sure that each byte points to a valid block */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2839 for (i = 0; i < 256; i++) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2840 if (((unsigned char *)code)[i] >= arg) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2841 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2842 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2843 code += offset; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2844 offset = arg * 32/sizeof(SRE_CODE); /* 32-byte bitmap times arg */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2845 if (code+offset < code || code+offset > end) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2846 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2847 code += offset; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2848 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2849 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2850 case SRE_OP_CATEGORY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2851 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2852 switch (arg) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2853 case SRE_CATEGORY_DIGIT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2854 case SRE_CATEGORY_NOT_DIGIT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2855 case SRE_CATEGORY_SPACE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2856 case SRE_CATEGORY_NOT_SPACE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2857 case SRE_CATEGORY_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2858 case SRE_CATEGORY_NOT_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2859 case SRE_CATEGORY_LINEBREAK: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2860 case SRE_CATEGORY_NOT_LINEBREAK: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2861 case SRE_CATEGORY_LOC_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2862 case SRE_CATEGORY_LOC_NOT_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2863 case SRE_CATEGORY_UNI_DIGIT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2864 case SRE_CATEGORY_UNI_NOT_DIGIT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2865 case SRE_CATEGORY_UNI_SPACE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2866 case SRE_CATEGORY_UNI_NOT_SPACE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2867 case SRE_CATEGORY_UNI_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2868 case SRE_CATEGORY_UNI_NOT_WORD: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2869 case SRE_CATEGORY_UNI_LINEBREAK: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2870 case SRE_CATEGORY_UNI_NOT_LINEBREAK: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2871 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2872 default: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2873 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2874 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2875 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2876 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2877 default: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2878 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2879 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2880 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2881 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2882 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2883 return 1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2884 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2885 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2886 static int |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2887 _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2888 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2889 /* Some variables are manipulated by the macros above */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2890 SRE_CODE op; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2891 SRE_CODE arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2892 SRE_CODE skip; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2893 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2894 VTRACE(("code=%p, end=%p\n", code, end)); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2895 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2896 if (code > end) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2897 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2898 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2899 while (code < end) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2900 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2901 switch (op) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2902 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2903 case SRE_OP_MARK: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2904 /* We don't check whether marks are properly nested; the |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2905 sre_match() code is robust even if they don't, and the worst |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2906 you can get is nonsensical match results. */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2907 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2908 if (arg > 2*groups+1) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2909 VTRACE(("arg=%d, groups=%d\n", (int)arg, (int)groups)); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2910 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2911 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2912 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2913 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2914 case SRE_OP_LITERAL: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2915 case SRE_OP_NOT_LITERAL: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2916 case SRE_OP_LITERAL_IGNORE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2917 case SRE_OP_NOT_LITERAL_IGNORE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2918 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2919 /* The arg is just a character, nothing to check */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2920 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2921 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2922 case SRE_OP_SUCCESS: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2923 case SRE_OP_FAILURE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2924 /* Nothing to check; these normally end the matching process */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2925 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2926 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2927 case SRE_OP_AT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2928 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2929 switch (arg) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2930 case SRE_AT_BEGINNING: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2931 case SRE_AT_BEGINNING_STRING: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2932 case SRE_AT_BEGINNING_LINE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2933 case SRE_AT_END: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2934 case SRE_AT_END_LINE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2935 case SRE_AT_END_STRING: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2936 case SRE_AT_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2937 case SRE_AT_NON_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2938 case SRE_AT_LOC_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2939 case SRE_AT_LOC_NON_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2940 case SRE_AT_UNI_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2941 case SRE_AT_UNI_NON_BOUNDARY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2942 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2943 default: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2944 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2945 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2946 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2947 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2948 case SRE_OP_ANY: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2949 case SRE_OP_ANY_ALL: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2950 /* These have no operands */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2951 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2952 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2953 case SRE_OP_IN: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2954 case SRE_OP_IN_IGNORE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2955 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2956 /* Stop 1 before the end; we check the FAILURE below */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2957 if (!_validate_charset(code, code+skip-2)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2958 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2959 if (code[skip-2] != SRE_OP_FAILURE) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2960 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2961 code += skip-1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2962 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2963 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2964 case SRE_OP_INFO: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2965 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2966 /* A minimal info field is |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2967 <INFO> <1=skip> <2=flags> <3=min> <4=max>; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2968 If SRE_INFO_PREFIX or SRE_INFO_CHARSET is in the flags, |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2969 more follows. */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2970 SRE_CODE flags, min, max, i; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2971 SRE_CODE *newcode; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2972 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2973 newcode = code+skip-1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2974 GET_ARG; flags = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2975 GET_ARG; min = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2976 GET_ARG; max = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2977 /* Check that only valid flags are present */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2978 if ((flags & ~(SRE_INFO_PREFIX | |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2979 SRE_INFO_LITERAL | |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2980 SRE_INFO_CHARSET)) != 0) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2981 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2982 /* PREFIX and CHARSET are mutually exclusive */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2983 if ((flags & SRE_INFO_PREFIX) && |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2984 (flags & SRE_INFO_CHARSET)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2985 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2986 /* LITERAL implies PREFIX */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2987 if ((flags & SRE_INFO_LITERAL) && |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2988 !(flags & SRE_INFO_PREFIX)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2989 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2990 /* Validate the prefix */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2991 if (flags & SRE_INFO_PREFIX) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2992 SRE_CODE prefix_len, prefix_skip; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2993 GET_ARG; prefix_len = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2994 GET_ARG; prefix_skip = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2995 /* Here comes the prefix string */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2996 if (code+prefix_len < code || code+prefix_len > newcode) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2997 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2998 code += prefix_len; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
2999 /* And here comes the overlap table */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3000 if (code+prefix_len < code || code+prefix_len > newcode) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3001 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3002 /* Each overlap value should be < prefix_len */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3003 for (i = 0; i < prefix_len; i++) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3004 if (code[i] >= prefix_len) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3005 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3006 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3007 code += prefix_len; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3008 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3009 /* Validate the charset */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3010 if (flags & SRE_INFO_CHARSET) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3011 if (!_validate_charset(code, newcode-1)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3012 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3013 if (newcode[-1] != SRE_OP_FAILURE) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3014 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3015 code = newcode; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3016 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3017 else if (code != newcode) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3018 VTRACE(("code=%p, newcode=%p\n", code, newcode)); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3019 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3020 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3021 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3022 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3023 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3024 case SRE_OP_BRANCH: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3025 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3026 SRE_CODE *target = NULL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3027 for (;;) { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3028 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3029 if (skip == 0) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3030 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3031 /* Stop 2 before the end; we check the JUMP below */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3032 if (!_validate_inner(code, code+skip-3, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3033 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3034 code += skip-3; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3035 /* Check that it ends with a JUMP, and that each JUMP |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3036 has the same target */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3037 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3038 if (op != SRE_OP_JUMP) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3039 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3040 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3041 if (target == NULL) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3042 target = code+skip-1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3043 else if (code+skip-1 != target) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3044 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3045 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3046 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3047 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3048 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3049 case SRE_OP_REPEAT_ONE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3050 case SRE_OP_MIN_REPEAT_ONE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3051 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3052 SRE_CODE min, max; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3053 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3054 GET_ARG; min = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3055 GET_ARG; max = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3056 if (min > max) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3057 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3058 #ifdef Py_UNICODE_WIDE |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3059 if (max > 65535) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3060 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3061 #endif |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3062 if (!_validate_inner(code, code+skip-4, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3063 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3064 code += skip-4; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3065 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3066 if (op != SRE_OP_SUCCESS) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3067 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3068 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3069 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3070 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3071 case SRE_OP_REPEAT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3072 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3073 SRE_CODE min, max; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3074 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3075 GET_ARG; min = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3076 GET_ARG; max = arg; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3077 if (min > max) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3078 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3079 #ifdef Py_UNICODE_WIDE |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3080 if (max > 65535) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3081 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3082 #endif |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3083 if (!_validate_inner(code, code+skip-3, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3084 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3085 code += skip-3; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3086 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3087 if (op != SRE_OP_MAX_UNTIL && op != SRE_OP_MIN_UNTIL) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3088 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3089 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3090 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3091 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3092 case SRE_OP_GROUPREF: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3093 case SRE_OP_GROUPREF_IGNORE: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3094 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3095 if (arg >= groups) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3096 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3097 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3098 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3099 case SRE_OP_GROUPREF_EXISTS: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3100 /* The regex syntax for this is: '(?(group)then|else)', where |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3101 'group' is either an integer group number or a group name, |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3102 'then' and 'else' are sub-regexes, and 'else' is optional. */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3103 GET_ARG; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3104 if (arg >= groups) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3105 FAIL; |
|
49126
95ac698358ab
- Issue #3629: Fix sre "bytecode" validator for an end case.
Guido van Rossum <guido@python.org>
parents:
48185
diff
changeset
|
3106 GET_SKIP_ADJ(1); |
|
48185
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3107 code--; /* The skip is relative to the first arg! */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3108 /* There are two possibilities here: if there is both a 'then' |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3109 part and an 'else' part, the generated code looks like: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3110 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3111 GROUPREF_EXISTS |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3112 <group> |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3113 <skipyes> |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3114 ...then part... |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3115 JUMP |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3116 <skipno> |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3117 (<skipyes> jumps here) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3118 ...else part... |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3119 (<skipno> jumps here) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3120 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3121 If there is only a 'then' part, it looks like: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3122 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3123 GROUPREF_EXISTS |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3124 <group> |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3125 <skip> |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3126 ...then part... |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3127 (<skip> jumps here) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3128 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3129 There is no direct way to decide which it is, and we don't want |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3130 to allow arbitrary jumps anywhere in the code; so we just look |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3131 for a JUMP opcode preceding our skip target. |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3132 */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3133 if (skip >= 3 && code+skip-3 >= code && |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3134 code[skip-3] == SRE_OP_JUMP) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3135 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3136 VTRACE(("both then and else parts present\n")); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3137 if (!_validate_inner(code+1, code+skip-3, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3138 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3139 code += skip-2; /* Position after JUMP, at <skipno> */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3140 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3141 if (!_validate_inner(code, code+skip-1, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3142 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3143 code += skip-1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3144 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3145 else { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3146 VTRACE(("only a then part present\n")); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3147 if (!_validate_inner(code+1, code+skip-1, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3148 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3149 code += skip-1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3150 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3151 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3152 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3153 case SRE_OP_ASSERT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3154 case SRE_OP_ASSERT_NOT: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3155 GET_SKIP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3156 GET_ARG; /* 0 for lookahead, width for lookbehind */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3157 code--; /* Back up over arg to simplify math below */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3158 if (arg & 0x80000000) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3159 FAIL; /* Width too large */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3160 /* Stop 1 before the end; we check the SUCCESS below */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3161 if (!_validate_inner(code+1, code+skip-2, groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3162 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3163 code += skip-2; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3164 GET_OP; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3165 if (op != SRE_OP_SUCCESS) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3166 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3167 break; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3168 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3169 default: |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3170 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3171 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3172 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3173 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3174 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3175 VTRACE(("okay\n")); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3176 return 1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3177 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3178 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3179 static int |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3180 _validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3181 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3182 if (groups < 0 || groups > 100 || code >= end || end[-1] != SRE_OP_SUCCESS) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3183 FAIL; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3184 if (groups == 0) /* fix for simplejson */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3185 groups = 100; /* 100 groups should always be safe */ |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3186 return _validate_inner(code, end-1, groups); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3187 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3188 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3189 static int |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3190 _validate(PatternObject *self) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3191 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3192 if (!_validate_outer(self->code, self->code+self->codesize, self->groups)) |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3193 { |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3194 PyErr_SetString(PyExc_RuntimeError, "invalid SRE code"); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3195 return 0; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3196 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3197 else |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3198 VTRACE(("Success!\n")); |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3199 return 1; |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3200 } |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3201 |
|
e5fc3e198dda
Tracker issue 3487: sre "bytecode" verifier.
Guido van Rossum <guido@python.org>
parents:
47527
diff
changeset
|
3202 /* -------------------------------------------------------------------- */ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3203 /* match methods */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3204 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3205 static void |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3206 match_dealloc(MatchObject* self) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3207 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3208 Py_XDECREF(self->regs); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3209 Py_XDECREF(self->string); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3210 Py_DECREF(self->pattern); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3211 PyObject_DEL(self); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3212 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3213 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3214 static PyObject* |
| 38770 | 3215 match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3216 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3217 if (index < 0 || index >= self->groups) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3218 /* raise IndexError if we were given a bad group number */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3219 PyErr_SetString( |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3220 PyExc_IndexError, |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3221 "no such group" |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3222 ); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3223 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3224 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3225 |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3226 index *= 2; |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3227 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3228 if (self->string == Py_None || self->mark[index] < 0) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3229 /* return default value if the string or group is undefined */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3230 Py_INCREF(def); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3231 return def; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3232 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3233 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3234 return PySequence_GetSlice( |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3235 self->string, self->mark[index], self->mark[index+1] |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3236 ); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3237 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3238 |
| 38770 | 3239 static Py_ssize_t |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3240 match_getindex(MatchObject* self, PyObject* index) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3241 { |
| 38770 | 3242 Py_ssize_t i; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3243 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3244 if (PyInt_Check(index)) |
| 38770 | 3245 return PyInt_AsSsize_t(index); |
| 13118 | 3246 |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3247 i = -1; |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3248 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3249 if (self->pattern->groupindex) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3250 index = PyObject_GetItem(self->pattern->groupindex, index); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3251 if (index) { |
| 38770 | 3252 if (PyInt_Check(index) || PyLong_Check(index)) |
| 3253 i = PyInt_AsSsize_t(index); | |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3254 Py_DECREF(index); |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3255 } else |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3256 PyErr_Clear(); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3257 } |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3258 |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3259 return i; |
| 13118 | 3260 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3261 |
| 13118 | 3262 static PyObject* |
|
13185
e9c34cca0c96
- fixed default value handling in group/groupdict
Fredrik Lundh <fredrik@pythonware.com>
parents:
13166
diff
changeset
|
3263 match_getslice(MatchObject* self, PyObject* index, PyObject* def) |
| 13118 | 3264 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3265 return match_getslice_by_index(self, match_getindex(self, index), def); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3266 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3267 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3268 static PyObject* |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3269 match_expand(MatchObject* self, PyObject* ptemplate) |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3270 { |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3271 /* delegate to Python code */ |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3272 return call( |
| 37017 | 3273 SRE_PY_MODULE, "_expand", |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3274 PyTuple_Pack(3, self->pattern, self, ptemplate) |
|
14726
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3275 ); |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3276 } |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3277 |
|
176660ff0c95
- fixed yet another gcc -pedantic warning
Fredrik Lundh <fredrik@pythonware.com>
parents:
14381
diff
changeset
|
3278 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3279 match_group(MatchObject* self, PyObject* args) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3280 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3281 PyObject* result; |
| 38770 | 3282 Py_ssize_t i, size; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3283 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3284 size = PyTuple_GET_SIZE(args); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3285 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3286 switch (size) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3287 case 0: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3288 result = match_getslice(self, Py_False, Py_None); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3289 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3290 case 1: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3291 result = match_getslice(self, PyTuple_GET_ITEM(args, 0), Py_None); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3292 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3293 default: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3294 /* fetch multiple items */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3295 result = PyTuple_New(size); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3296 if (!result) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3297 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3298 for (i = 0; i < size; i++) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3299 PyObject* item = match_getslice( |
|
13185
e9c34cca0c96
- fixed default value handling in group/groupdict
Fredrik Lundh <fredrik@pythonware.com>
parents:
13166
diff
changeset
|
3300 self, PyTuple_GET_ITEM(args, i), Py_None |
|
e9c34cca0c96
- fixed default value handling in group/groupdict
Fredrik Lundh <fredrik@pythonware.com>
parents:
13166
diff
changeset
|
3301 ); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3302 if (!item) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3303 Py_DECREF(result); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3304 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3305 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3306 PyTuple_SET_ITEM(result, i, item); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3307 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3308 break; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3309 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3310 return result; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3311 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3312 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3313 static PyObject* |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3314 match_groups(MatchObject* self, PyObject* args, PyObject* kw) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3315 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3316 PyObject* result; |
| 38770 | 3317 Py_ssize_t index; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3318 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3319 PyObject* def = Py_None; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
3320 static char* kwlist[] = { "default", NULL }; |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3321 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groups", kwlist, &def)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3322 return NULL; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3323 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3324 result = PyTuple_New(self->groups-1); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3325 if (!result) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3326 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3327 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3328 for (index = 1; index < self->groups; index++) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3329 PyObject* item; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3330 item = match_getslice_by_index(self, index, def); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3331 if (!item) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3332 Py_DECREF(result); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3333 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3334 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3335 PyTuple_SET_ITEM(result, index-1, item); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3336 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3337 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3338 return result; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3339 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3340 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3341 static PyObject* |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3342 match_groupdict(MatchObject* self, PyObject* args, PyObject* kw) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3343 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3344 PyObject* result; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3345 PyObject* keys; |
| 38770 | 3346 Py_ssize_t index; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3347 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3348 PyObject* def = Py_None; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36363
diff
changeset
|
3349 static char* kwlist[] = { "default", NULL }; |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3350 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:groupdict", kwlist, &def)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3351 return NULL; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3352 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3353 result = PyDict_New(); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3354 if (!result || !self->pattern->groupindex) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3355 return result; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3356 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3357 keys = PyMapping_Keys(self->pattern->groupindex); |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3358 if (!keys) |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3359 goto failed; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3360 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3361 for (index = 0; index < PyList_GET_SIZE(keys); index++) { |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3362 int status; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3363 PyObject* key; |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3364 PyObject* value; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3365 key = PyList_GET_ITEM(keys, index); |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3366 if (!key) |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3367 goto failed; |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3368 value = match_getslice(self, key, def); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3369 if (!value) { |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3370 Py_DECREF(key); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3371 goto failed; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3372 } |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3373 status = PyDict_SetItem(result, key, value); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3374 Py_DECREF(value); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3375 if (status < 0) |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3376 goto failed; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3377 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3378 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3379 Py_DECREF(keys); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3380 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3381 return result; |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3382 |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3383 failed: |
|
36861
895074e5ed3a
Thanks to Coverity, these were all reported by their Prevent tool.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36675
diff
changeset
|
3384 Py_XDECREF(keys); |
|
15855
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3385 Py_DECREF(result); |
|
152d00718006
SRE fixes for 2.1 alpha:
Fredrik Lundh <fredrik@pythonware.com>
parents:
15643
diff
changeset
|
3386 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3387 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3388 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3389 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3390 match_start(MatchObject* self, PyObject* args) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3391 { |
| 38770 | 3392 Py_ssize_t index; |
| 13118 | 3393 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3394 PyObject* index_ = Py_False; /* zero */ |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38475
diff
changeset
|
3395 if (!PyArg_UnpackTuple(args, "start", 0, 1, &index_)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3396 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3397 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3398 index = match_getindex(self, index_); |
| 13118 | 3399 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3400 if (index < 0 || index >= self->groups) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3401 PyErr_SetString( |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3402 PyExc_IndexError, |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3403 "no such group" |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3404 ); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3405 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3406 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3407 |
|
14381
7958a88edda1
return -1 for undefined groups (as implemented in 1.5.2) instead of
Fredrik Lundh <fredrik@pythonware.com>
parents:
14235
diff
changeset
|
3408 /* mark is -1 if group is undefined */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3409 return Py_BuildValue("i", self->mark[index*2]); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3410 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3411 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3412 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3413 match_end(MatchObject* self, PyObject* args) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3414 { |
| 38770 | 3415 Py_ssize_t index; |
| 13118 | 3416 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3417 PyObject* index_ = Py_False; /* zero */ |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38475
diff
changeset
|
3418 if (!PyArg_UnpackTuple(args, "end", 0, 1, &index_)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3419 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3420 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3421 index = match_getindex(self, index_); |
| 13118 | 3422 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3423 if (index < 0 || index >= self->groups) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3424 PyErr_SetString( |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3425 PyExc_IndexError, |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3426 "no such group" |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3427 ); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3428 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3429 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3430 |
|
14381
7958a88edda1
return -1 for undefined groups (as implemented in 1.5.2) instead of
Fredrik Lundh <fredrik@pythonware.com>
parents:
14235
diff
changeset
|
3431 /* mark is -1 if group is undefined */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3432 return Py_BuildValue("i", self->mark[index*2+1]); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3433 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3434 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3435 LOCAL(PyObject*) |
| 38770 | 3436 _pair(Py_ssize_t i1, Py_ssize_t i2) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3437 { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3438 PyObject* pair; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3439 PyObject* item; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3440 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3441 pair = PyTuple_New(2); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3442 if (!pair) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3443 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3444 |
| 38770 | 3445 item = PyInt_FromSsize_t(i1); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3446 if (!item) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3447 goto error; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3448 PyTuple_SET_ITEM(pair, 0, item); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3449 |
| 38770 | 3450 item = PyInt_FromSsize_t(i2); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3451 if (!item) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3452 goto error; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3453 PyTuple_SET_ITEM(pair, 1, item); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3454 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3455 return pair; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3456 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3457 error: |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3458 Py_DECREF(pair); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3459 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3460 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3461 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3462 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3463 match_span(MatchObject* self, PyObject* args) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3464 { |
| 38770 | 3465 Py_ssize_t index; |
| 13118 | 3466 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3467 PyObject* index_ = Py_False; /* zero */ |
|
38489
3fe3ccdf0155
Make use of METH_O and METH_NOARGS where possible.
Georg Brandl <georg@python.org>
parents:
38475
diff
changeset
|
3468 if (!PyArg_UnpackTuple(args, "span", 0, 1, &index_)) |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3469 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3470 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3471 index = match_getindex(self, index_); |
| 13118 | 3472 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3473 if (index < 0 || index >= self->groups) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3474 PyErr_SetString( |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3475 PyExc_IndexError, |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3476 "no such group" |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3477 ); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3478 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3479 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3480 |
|
14381
7958a88edda1
return -1 for undefined groups (as implemented in 1.5.2) instead of
Fredrik Lundh <fredrik@pythonware.com>
parents:
14235
diff
changeset
|
3481 /* marks are -1 if group is undefined */ |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3482 return _pair(self->mark[index*2], self->mark[index*2+1]); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3483 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3484 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3485 static PyObject* |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3486 match_regs(MatchObject* self) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3487 { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3488 PyObject* regs; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3489 PyObject* item; |
| 38770 | 3490 Py_ssize_t index; |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3491 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3492 regs = PyTuple_New(self->groups); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3493 if (!regs) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3494 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3495 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3496 for (index = 0; index < self->groups; index++) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3497 item = _pair(self->mark[index*2], self->mark[index*2+1]); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3498 if (!item) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3499 Py_DECREF(regs); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3500 return NULL; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3501 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3502 PyTuple_SET_ITEM(regs, index, item); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3503 } |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3504 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3505 Py_INCREF(regs); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3506 self->regs = regs; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3507 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3508 return regs; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3509 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3510 |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3511 static PyObject* |
|
38475
9f3284c92eb3
METH_NOARGS functions do get called with two args.
Georg Brandl <georg@python.org>
parents:
38473
diff
changeset
|
3512 match_copy(MatchObject* self, PyObject *unused) |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3513 { |
| 18373 | 3514 #ifdef USE_BUILTIN_COPY |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3515 MatchObject* copy; |
| 38770 | 3516 Py_ssize_t slots, offset; |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
3517 |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3518 slots = 2 * (self->pattern->groups+1); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3519 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3520 copy = PyObject_NEW_VAR(MatchObject, &Match_Type, slots); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3521 if (!copy) |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3522 return NULL; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3523 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3524 /* this value a constant, but any compiler should be able to |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3525 figure that out all by itself */ |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3526 offset = offsetof(MatchObject, string); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3527 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3528 Py_XINCREF(self->pattern); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3529 Py_XINCREF(self->string); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3530 Py_XINCREF(self->regs); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3531 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3532 memcpy((char*) copy + offset, (char*) self + offset, |
| 38770 | 3533 sizeof(MatchObject) + slots * sizeof(Py_ssize_t) - offset); |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3534 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3535 return (PyObject*) copy; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3536 #else |
| 18373 | 3537 PyErr_SetString(PyExc_TypeError, "cannot copy this match object"); |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3538 return NULL; |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3539 #endif |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3540 } |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3541 |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3542 static PyObject* |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3543 match_deepcopy(MatchObject* self, PyObject* memo) |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3544 { |
| 18373 | 3545 #ifdef USE_BUILTIN_COPY |
| 3546 MatchObject* copy; | |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
3547 |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3548 copy = (MatchObject*) match_copy(self); |
| 18373 | 3549 if (!copy) |
| 3550 return NULL; | |
| 3551 | |
| 3552 if (!deepcopy((PyObject**) ©->pattern, memo) || | |
| 3553 !deepcopy(©->string, memo) || | |
| 3554 !deepcopy(©->regs, memo)) { | |
| 3555 Py_DECREF(copy); | |
| 3556 return NULL; | |
| 3557 } | |
| 3558 | |
| 3559 #else | |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3560 PyErr_SetString(PyExc_TypeError, "cannot deepcopy this match object"); |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3561 return NULL; |
| 18373 | 3562 #endif |
|
18363
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3563 } |
|
c0288670230e
merged with pythonware's SRE 2.1.1 codebase
Fredrik Lundh <fredrik@pythonware.com>
parents:
17532
diff
changeset
|
3564 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3565 static PyMethodDef match_methods[] = { |
|
15000
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3566 {"group", (PyCFunction) match_group, METH_VARARGS}, |
|
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3567 {"start", (PyCFunction) match_start, METH_VARARGS}, |
|
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3568 {"end", (PyCFunction) match_end, METH_VARARGS}, |
|
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3569 {"span", (PyCFunction) match_span, METH_VARARGS}, |
|
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3570 {"groups", (PyCFunction) match_groups, METH_VARARGS|METH_KEYWORDS}, |
|
0a97f5dde3a7
Accept keyword arguments for (most) pattern and match object
Fredrik Lundh <fredrik@pythonware.com>
parents:
14992
diff
changeset
|
3571 {"groupdict", (PyCFunction) match_groupdict, METH_VARARGS|METH_KEYWORDS}, |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3572 {"expand", (PyCFunction) match_expand, METH_O}, |
|
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3573 {"__copy__", (PyCFunction) match_copy, METH_NOARGS}, |
|
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3574 {"__deepcopy__", (PyCFunction) match_deepcopy, METH_O}, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3575 {NULL, NULL} |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3576 }; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3577 |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
3578 static PyObject* |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3579 match_getattr(MatchObject* self, char* name) |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3580 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3581 PyObject* res; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3582 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3583 res = Py_FindMethod(match_methods, (PyObject*) self, name); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3584 if (res) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3585 return res; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3586 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3587 PyErr_Clear(); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3588 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3589 if (!strcmp(name, "lastindex")) { |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3590 if (self->lastindex >= 0) |
|
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3591 return Py_BuildValue("i", self->lastindex); |
|
13310
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3592 Py_INCREF(Py_None); |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3593 return Py_None; |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3594 } |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3595 |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3596 if (!strcmp(name, "lastgroup")) { |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3597 if (self->pattern->indexgroup && self->lastindex >= 0) { |
|
13310
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3598 PyObject* result = PySequence_GetItem( |
|
13327
c155bccb7a22
- added lookbehind support (?<=pattern), (?<!pattern).
Fredrik Lundh <fredrik@pythonware.com>
parents:
13310
diff
changeset
|
3599 self->pattern->indexgroup, self->lastindex |
|
13310
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3600 ); |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3601 if (result) |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3602 return result; |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3603 PyErr_Clear(); |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3604 } |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3605 Py_INCREF(Py_None); |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3606 return Py_None; |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3607 } |
|
3c35bf7b580b
- experimental: added two new attributes to the match object:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13308
diff
changeset
|
3608 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3609 if (!strcmp(name, "string")) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3610 if (self->string) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3611 Py_INCREF(self->string); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3612 return self->string; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3613 } else { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3614 Py_INCREF(Py_None); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3615 return Py_None; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3616 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3617 } |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3618 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3619 if (!strcmp(name, "regs")) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3620 if (self->regs) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3621 Py_INCREF(self->regs); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3622 return self->regs; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3623 } else |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3624 return match_regs(self); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3625 } |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3626 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3627 if (!strcmp(name, "re")) { |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3628 Py_INCREF(self->pattern); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3629 return (PyObject*) self->pattern; |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3630 } |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3631 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3632 if (!strcmp(name, "pos")) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3633 return Py_BuildValue("i", self->pos); |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3634 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3635 if (!strcmp(name, "endpos")) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3636 return Py_BuildValue("i", self->endpos); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3637 |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3638 PyErr_SetString(PyExc_AttributeError, name); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3639 return NULL; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3640 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3641 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3642 /* FIXME: implement setattr("string", None) as a special case (to |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3643 detach the associated string, if any */ |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3644 |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3645 statichere PyTypeObject Match_Type = { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3646 PyObject_HEAD_INIT(NULL) |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
3647 0, "_" SRE_MODULE ".SRE_Match", |
| 38770 | 3648 sizeof(MatchObject), sizeof(Py_ssize_t), |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3649 (destructor)match_dealloc, /*tp_dealloc*/ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3650 0, /*tp_print*/ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3651 (getattrfunc)match_getattr /*tp_getattr*/ |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3652 }; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3653 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3654 static PyObject* |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3655 pattern_new_match(PatternObject* pattern, SRE_STATE* state, int status) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3656 { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3657 /* create match object (from state object) */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3658 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3659 MatchObject* match; |
| 38770 | 3660 Py_ssize_t i, j; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3661 char* base; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3662 int n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3663 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3664 if (status > 0) { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3665 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3666 /* create match object (with room for extra group marks) */ |
|
44749
55ddb166f1d1
Silence Coverity false alerts with CIDs #172, #183, #184
Christian Heimes <christian@cheimes.de>
parents:
44602
diff
changeset
|
3667 /* coverity[ampersand_in_size] */ |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3668 match = PyObject_NEW_VAR(MatchObject, &Match_Type, |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3669 2*(pattern->groups+1)); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3670 if (!match) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3671 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3672 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3673 Py_INCREF(pattern); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3674 match->pattern = pattern; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3675 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3676 Py_INCREF(state->string); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3677 match->string = state->string; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3678 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3679 match->regs = NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3680 match->groups = pattern->groups+1; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3681 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3682 /* fill in group slices */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3683 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3684 base = (char*) state->beginning; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3685 n = state->charsize; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3686 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3687 match->mark[0] = ((char*) state->start - base) / n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3688 match->mark[1] = ((char*) state->ptr - base) / n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3689 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3690 for (i = j = 0; i < pattern->groups; i++, j+=2) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3691 if (j+1 <= state->lastmark && state->mark[j] && state->mark[j+1]) { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3692 match->mark[j+2] = ((char*) state->mark[j] - base) / n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3693 match->mark[j+3] = ((char*) state->mark[j+1] - base) / n; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3694 } else |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3695 match->mark[j+2] = match->mark[j+3] = -1; /* undefined */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3696 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3697 match->pos = state->pos; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3698 match->endpos = state->endpos; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3699 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3700 match->lastindex = state->lastindex; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3701 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3702 return (PyObject*) match; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3703 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3704 } else if (status == 0) { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3705 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3706 /* no match */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3707 Py_INCREF(Py_None); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3708 return Py_None; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3709 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3710 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3711 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3712 /* internal error */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3713 pattern_error(status); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3714 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3715 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3716 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3717 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3718 /* -------------------------------------------------------------------- */ |
| 13136 | 3719 /* scanner methods (experimental) */ |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3720 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3721 static void |
| 13136 | 3722 scanner_dealloc(ScannerObject* self) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3723 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3724 state_fini(&self->state); |
|
58326
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
3725 Py_XDECREF(self->pattern); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3726 PyObject_DEL(self); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3727 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3728 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3729 static PyObject* |
|
38475
9f3284c92eb3
METH_NOARGS functions do get called with two args.
Georg Brandl <georg@python.org>
parents:
38473
diff
changeset
|
3730 scanner_match(ScannerObject* self, PyObject *unused) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3731 { |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3732 SRE_STATE* state = &self->state; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3733 PyObject* match; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3734 int status; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3735 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
3736 state_reset(state); |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
3737 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3738 state->ptr = state->start; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3739 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3740 if (state->charsize == 1) { |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
3741 status = sre_match(state, PatternObject_GetCode(self->pattern)); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3742 } else { |
| 13118 | 3743 #if defined(HAVE_UNICODE) |
|
31180
4942a0b63c8c
Cleaning up recursive pieces left in the reorganization.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
30712
diff
changeset
|
3744 status = sre_umatch(state, PatternObject_GetCode(self->pattern)); |
| 13118 | 3745 #endif |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3746 } |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
3747 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
3748 return NULL; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3749 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3750 match = pattern_new_match((PatternObject*) self->pattern, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3751 state, status); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3752 |
|
33398
d1f8c632b605
Fixing bug #817234, which made SRE get into an infinite loop on
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
32695
diff
changeset
|
3753 if (status == 0 || state->ptr == state->start) |
| 13118 | 3754 state->start = (void*) ((char*) state->ptr + state->charsize); |
| 3755 else | |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3756 state->start = state->ptr; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3757 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3758 return match; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3759 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3760 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3761 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3762 static PyObject* |
|
38475
9f3284c92eb3
METH_NOARGS functions do get called with two args.
Georg Brandl <georg@python.org>
parents:
38473
diff
changeset
|
3763 scanner_search(ScannerObject* self, PyObject *unused) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3764 { |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3765 SRE_STATE* state = &self->state; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3766 PyObject* match; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3767 int status; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3768 |
|
13789
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
3769 state_reset(state); |
|
4edd13eb759d
SRE 0.9.8: passes the entire test suite
Fredrik Lundh <fredrik@pythonware.com>
parents:
13677
diff
changeset
|
3770 |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3771 state->ptr = state->start; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3772 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3773 if (state->charsize == 1) { |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3774 status = sre_search(state, PatternObject_GetCode(self->pattern)); |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3775 } else { |
| 13118 | 3776 #if defined(HAVE_UNICODE) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3777 status = sre_usearch(state, PatternObject_GetCode(self->pattern)); |
| 13118 | 3778 #endif |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3779 } |
|
40001
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
3780 if (PyErr_Occurred()) |
|
4404a3981470
Cause a PyObject_Malloc() failure to trigger a MemoryError, and then
Andrew M. Kuchling <amk@amk.ca>
parents:
39452
diff
changeset
|
3781 return NULL; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3782 |
|
13121
faefff43e58a
- last patch broke parse_template; fixed by changing some
Fredrik Lundh <fredrik@pythonware.com>
parents:
13119
diff
changeset
|
3783 match = pattern_new_match((PatternObject*) self->pattern, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3784 state, status); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3785 |
|
33398
d1f8c632b605
Fixing bug #817234, which made SRE get into an infinite loop on
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
32695
diff
changeset
|
3786 if (status == 0 || state->ptr == state->start) |
| 13136 | 3787 state->start = (void*) ((char*) state->ptr + state->charsize); |
| 3788 else | |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3789 state->start = state->ptr; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3790 |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3791 return match; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3792 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3793 |
| 13136 | 3794 static PyMethodDef scanner_methods[] = { |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3795 {"match", (PyCFunction) scanner_match, METH_NOARGS}, |
|
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3796 {"search", (PyCFunction) scanner_search, METH_NOARGS}, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3797 {NULL, NULL} |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3798 }; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3799 |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
3800 static PyObject* |
| 13136 | 3801 scanner_getattr(ScannerObject* self, char* name) |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3802 { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3803 PyObject* res; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3804 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3805 res = Py_FindMethod(scanner_methods, (PyObject*) self, name); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3806 if (res) |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3807 return res; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3808 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3809 PyErr_Clear(); |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3810 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3811 /* attributes */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3812 if (!strcmp(name, "pattern")) { |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3813 Py_INCREF(self->pattern); |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3814 return self->pattern; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3815 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3816 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3817 PyErr_SetString(PyExc_AttributeError, name); |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3818 return NULL; |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3819 } |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3820 |
| 13136 | 3821 statichere PyTypeObject Scanner_Type = { |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3822 PyObject_HEAD_INIT(NULL) |
|
21319
4bcfb9dc57e0
bug #133283, #477728, #483789, #490573
Fredrik Lundh <fredrik@pythonware.com>
parents:
21313
diff
changeset
|
3823 0, "_" SRE_MODULE ".SRE_Scanner", |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3824 sizeof(ScannerObject), 0, |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3825 (destructor)scanner_dealloc, /*tp_dealloc*/ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3826 0, /*tp_print*/ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3827 (getattrfunc)scanner_getattr, /*tp_getattr*/ |
|
12819
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3828 }; |
|
a24d9ad6786d
Fredrik Lundh: here's the 96.6% version of SRE
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12576
diff
changeset
|
3829 |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3830 static PyObject* |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3831 pattern_scanner(PatternObject* pattern, PyObject* args) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3832 { |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3833 /* create search state object */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3834 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3835 ScannerObject* self; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3836 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3837 PyObject* string; |
| 38770 | 3838 Py_ssize_t start = 0; |
| 3839 Py_ssize_t end = PY_SSIZE_T_MAX; | |
| 3840 if (!PyArg_ParseTuple(args, "O|nn:scanner", &string, &start, &end)) | |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3841 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3842 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3843 /* create scanner object */ |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3844 self = PyObject_NEW(ScannerObject, &Scanner_Type); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3845 if (!self) |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3846 return NULL; |
|
58326
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
3847 self->pattern = NULL; |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3848 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3849 string = state_init(&self->state, pattern, string, start, end); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3850 if (!string) { |
|
58326
35469e79ff80
Merged revisions 77499 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
49126
diff
changeset
|
3851 Py_DECREF(self); |
|
37617
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3852 return NULL; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3853 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3854 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3855 Py_INCREF(pattern); |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3856 self->pattern = (PyObject*) pattern; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3857 |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3858 return (PyObject*) self; |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3859 } |
|
8968b1242f18
Move constructors, add some casts to make C++ compiler happy. Still a problem
Anthony Baxter <anthonybaxter@gmail.com>
parents:
37017
diff
changeset
|
3860 |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3861 static PyMethodDef _functions[] = { |
|
22706
14ebd7610902
Use symbolic METH_VARARGS/METH_OLDARGS instead of 1/0 for ml_flags
Neal Norwitz <nnorwitz@gmail.com>
parents:
21319
diff
changeset
|
3862 {"compile", _compile, METH_VARARGS}, |
|
38473
d60c7f6c2aa0
Fix C function calling conventions in _sre module.
Georg Brandl <georg@python.org>
parents:
38444
diff
changeset
|
3863 {"getcodesize", sre_codesize, METH_NOARGS}, |
|
22706
14ebd7610902
Use symbolic METH_VARARGS/METH_OLDARGS instead of 1/0 for ml_flags
Neal Norwitz <nnorwitz@gmail.com>
parents:
21319
diff
changeset
|
3864 {"getlower", sre_getlower, METH_VARARGS}, |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3865 {NULL, NULL} |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3866 }; |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3867 |
|
36363
6fcb5405074e
_compile(): raise an exception if downcasting to SRE_CODE
Tim Peters <tim.peters@gmail.com>
parents:
36324
diff
changeset
|
3868 #if PY_VERSION_HEX < 0x02030000 |
|
28905
fa5950fbe736
Allow _sre.c to compile with Python 2.2
Andrew M. Kuchling <amk@amk.ca>
parents:
28866
diff
changeset
|
3869 DL_EXPORT(void) init_sre(void) |
|
fa5950fbe736
Allow _sre.c to compile with Python 2.2
Andrew M. Kuchling <amk@amk.ca>
parents:
28866
diff
changeset
|
3870 #else |
|
24315
a8df0c0be242
Land Patch [ 566100 ] Rationalize DL_IMPORT and DL_EXPORT.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24280
diff
changeset
|
3871 PyMODINIT_FUNC init_sre(void) |
|
28905
fa5950fbe736
Allow _sre.c to compile with Python 2.2
Andrew M. Kuchling <amk@amk.ca>
parents:
28866
diff
changeset
|
3872 #endif |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3873 { |
|
15877
93d0567c9fc9
added "magic" number to the _sre module, to avoid weird errors caused
Fredrik Lundh <fredrik@pythonware.com>
parents:
15869
diff
changeset
|
3874 PyObject* m; |
|
93d0567c9fc9
added "magic" number to the _sre module, to avoid weird errors caused
Fredrik Lundh <fredrik@pythonware.com>
parents:
15869
diff
changeset
|
3875 PyObject* d; |
|
19320
7957b3f5d462
init_sre(): Plug a little leak reported by Insure.
Barry Warsaw <barry@python.org>
parents:
18433
diff
changeset
|
3876 PyObject* x; |
|
15877
93d0567c9fc9
added "magic" number to the _sre module, to avoid weird errors caused
Fredrik Lundh <fredrik@pythonware.com>
parents:
15869
diff
changeset
|
3877 |
|
13677
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3878 /* Patch object types */ |
|
edb1a8e6b859
-- SRE 0.9.6 sync. this includes:
Fredrik Lundh <fredrik@pythonware.com>
parents:
13651
diff
changeset
|
3879 Pattern_Type.ob_type = Match_Type.ob_type = |
| 13136 | 3880 Scanner_Type.ob_type = &PyType_Type; |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3881 |
|
15909
8db319ddfb37
bumped SRE version number to 2.1. cleaned up and added 1.5.2
Fredrik Lundh <fredrik@pythonware.com>
parents:
15906
diff
changeset
|
3882 m = Py_InitModule("_" SRE_MODULE, _functions); |
|
36324
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
3883 if (m == NULL) |
|
1af7f719ed28
Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35999
diff
changeset
|
3884 return; |
|
15877
93d0567c9fc9
added "magic" number to the _sre module, to avoid weird errors caused
Fredrik Lundh <fredrik@pythonware.com>
parents:
15869
diff
changeset
|
3885 d = PyModule_GetDict(m); |
|
93d0567c9fc9
added "magic" number to the _sre module, to avoid weird errors caused
Fredrik Lundh <fredrik@pythonware.com>
parents:
15869
diff
changeset
|
3886 |
|
19963
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3887 x = PyInt_FromLong(SRE_MAGIC); |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3888 if (x) { |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3889 PyDict_SetItemString(d, "MAGIC", x); |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3890 Py_DECREF(x); |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3891 } |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3892 |
|
28691
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3893 x = PyInt_FromLong(sizeof(SRE_CODE)); |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3894 if (x) { |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3895 PyDict_SetItemString(d, "CODESIZE", x); |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3896 Py_DECREF(x); |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3897 } |
|
c9925fa29ea3
Fully support 32-bit codes. Enable BIGCHARSET in UCS-4 builds.
Martin v. Löwis <martin@v.loewis.de>
parents:
28603
diff
changeset
|
3898 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
3899 x = PyString_FromString(copyright); |
|
19963
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3900 if (x) { |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3901 PyDict_SetItemString(d, "copyright", x); |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3902 Py_DECREF(x); |
|
969e306b62fd
an SRE bugfix a day keeps Guido away...
Fredrik Lundh <fredrik@pythonware.com>
parents:
19603
diff
changeset
|
3903 } |
|
12176
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3904 } |
|
db83e63b384b
Adding Fredrik Lundh's _sre.c module and its header files.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3905 |
| 13118 | 3906 #endif /* !defined(SRE_RECURSIVE) */ |
|
28704
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
3907 |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
3908 /* vim:ts=4:sw=4:et |
|
fa7874ec6a71
More work on bug #672491 and patch #712900.
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
28700
diff
changeset
|
3909 */ |
