summaryrefslogtreecommitdiffstats
path: root/Modules/_sre.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_sre.c')
-rw-r--r--Modules/_sre.c137
1 files changed, 41 insertions, 96 deletions
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 3a2d47c..5573046 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -76,10 +76,6 @@ static char copyright[] =
/* -------------------------------------------------------------------- */
/* optional features */
-/* test: define to use sre.py helpers instead of C code */
-#undef USE_PYTHON_SPLIT
-#undef USE_PYTHON_SUB
-
/* prevent run-away recursion (bad patterns on long strings) */
#if !defined(USE_STACKCHECK)
@@ -1251,6 +1247,8 @@ SRE_SEARCH(SRE_STATE* state, SRE_CODE* pattern)
TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr));
state->start = ptr;
state->ptr = ++ptr;
+ if (flags & SRE_INFO_LITERAL)
+ return 1; /* we got all of it */
status = SRE_MATCH(state, pattern + 2, 1);
if (status != 0)
break;
@@ -1820,66 +1818,6 @@ join(PyObject* list, PyObject* pattern)
return result;
}
-
-#ifdef USE_PYTHON_SUB
-static PyObject*
-pattern_sub(PatternObject* self, PyObject* args, PyObject* kw)
-{
- PyObject* template;
- PyObject* string;
- PyObject* count = Py_False; /* zero */
- static char* kwlist[] = { "repl", "string", "count", NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|O:sub", kwlist,
- &template, &string, &count))
- return NULL;
-
- /* delegate to Python code */
- return call(
- SRE_MODULE, "_sub",
- Py_BuildValue("OOOO", self, template, string, count)
- );
-}
-#endif
-
-#ifdef USE_PYTHON_SUB
-static PyObject*
-pattern_subn(PatternObject* self, PyObject* args, PyObject* kw)
-{
- PyObject* template;
- PyObject* string;
- PyObject* count = Py_False; /* zero */
- static char* kwlist[] = { "repl", "string", "count", NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|O:subn", kwlist,
- &template, &string, &count))
- return NULL;
-
- /* delegate to Python code */
- return call(
- SRE_MODULE, "_subn",
- Py_BuildValue("OOOO", self, template, string, count)
- );
-}
-#endif
-
-#if defined(USE_PYTHON_SPLIT)
-static PyObject*
-pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
-{
- PyObject* string;
- PyObject* maxsplit = Py_False; /* zero */
- static char* kwlist[] = { "source", "maxsplit", NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kw, "O|O:split", kwlist,
- &string, &maxsplit))
- return NULL;
-
- /* delegate to Python code */
- return call(
- SRE_MODULE, "_split",
- Py_BuildValue("OOO", self, string, maxsplit)
- );
-}
-#endif
-
static PyObject*
pattern_findall(PatternObject* self, PyObject* args, PyObject* kw)
{
@@ -1980,7 +1918,6 @@ error:
}
-#if !defined(USE_PYTHON_SPLIT)
static PyObject*
pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
{
@@ -2071,15 +2008,16 @@ pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
}
/* get segment following last match */
- item = PySequence_GetSlice(
- string, STATE_OFFSET(&state, last), state.endpos
- );
- if (!item)
- goto error;
- status = PyList_Append(list, item);
- Py_DECREF(item);
- if (status < 0)
- goto error;
+ i = STATE_OFFSET(&state, last);
+ if (i < state.endpos) {
+ item = PySequence_GetSlice(string, i, state.endpos);
+ if (!item)
+ goto error;
+ status = PyList_Append(list, item);
+ Py_DECREF(item);
+ if (status < 0)
+ goto error;
+ }
state_fini(&state);
return list;
@@ -2090,9 +2028,7 @@ error:
return NULL;
}
-#endif
-#if !defined(USE_PYTHON_SUB)
static PyObject*
pattern_subx(PatternObject* self, PyObject* template, PyObject* string,
int count, int subn)
@@ -2108,15 +2044,22 @@ pattern_subx(PatternObject* self, PyObject* template, PyObject* string,
int i, b, e;
int filter_is_callable;
- /* call subx helper to get the filter */
- filter = call(
- SRE_MODULE, "_subx",
- Py_BuildValue("OO", self, template)
- );
- if (!filter)
- return NULL;
-
- filter_is_callable = PyCallable_Check(filter);
+ if (PyCallable_Check(template)) {
+ /* sub/subn takes either a function or a template */
+ filter = template;
+ Py_INCREF(filter);
+ filter_is_callable = 1;
+ } else {
+ /* if not callable, call the template compiler. it may return
+ either a filter function or a literal string */
+ filter = call(
+ SRE_MODULE, "_subx",
+ Py_BuildValue("OO", self, template)
+ );
+ if (!filter)
+ return NULL;
+ filter_is_callable = PyCallable_Check(filter);
+ }
string = state_init(&state, self, string, 0, INT_MAX);
if (!string)
@@ -2169,7 +2112,7 @@ pattern_subx(PatternObject* self, PyObject* template, PyObject* string,
goto next;
if (filter_is_callable) {
- /* filter match */
+ /* pass match object through filter */
match = pattern_new_match(self, &state, 1);
if (!match)
goto error;
@@ -2186,7 +2129,7 @@ pattern_subx(PatternObject* self, PyObject* template, PyObject* string,
} else {
/* filter is literal string */
item = filter;
- Py_INCREF(filter);
+ Py_INCREF(item);
}
/* add to list */
@@ -2208,18 +2151,21 @@ next:
}
/* get segment following last match */
- item = PySequence_GetSlice(string, i, state.endpos);
- if (!item)
- goto error;
- status = PyList_Append(list, item);
- Py_DECREF(item);
- if (status < 0)
- goto error;
+ if (i < state.endpos) {
+ item = PySequence_GetSlice(string, i, state.endpos);
+ if (!item)
+ goto error;
+ status = PyList_Append(list, item);
+ Py_DECREF(item);
+ if (status < 0)
+ goto error;
+ }
state_fini(&state);
- /* convert list to single string */
+ /* convert list to single string (also removes list) */
item = join(list, self->pattern);
+
if (!item)
return NULL;
@@ -2262,7 +2208,6 @@ pattern_subn(PatternObject* self, PyObject* args, PyObject* kw)
return pattern_subx(self, template, string, count, 1);
}
-#endif
static PyObject*
pattern_copy(PatternObject* self, PyObject* args)