Commit 816671c6 authored by Guido van Rossum's avatar Guido van Rossum

patch for re.sub bug, by AMK.

parent 193338af
...@@ -57,11 +57,13 @@ extern void (*pcre_free)(void *); ...@@ -57,11 +57,13 @@ extern void (*pcre_free)(void *);
#ifdef FOR_PYTHON #ifdef FOR_PYTHON
extern pcre *pcre_compile(const char *, int, const char **, int *, PyObject *); extern pcre *pcre_compile(const char *, int, const char **, int *, PyObject *);
extern int pcre_exec(const pcre *, const pcre_extra *, const char *,
int, int, int, int *, int);
#else #else
extern pcre *pcre_compile(const char *, int, const char **, int *); extern pcre *pcre_compile(const char *, int, const char **, int *);
#endif
extern int pcre_exec(const pcre *, const pcre_extra *, const char *, extern int pcre_exec(const pcre *, const pcre_extra *, const char *,
int, int, int *, int); int, int, int *, int);
#endif
extern int pcre_info(const pcre *, int *, int *); extern int pcre_info(const pcre *, int *, int *);
extern pcre_extra *pcre_study(const pcre *, int, const char **); extern pcre_extra *pcre_study(const pcre *, int, const char **);
extern const char *pcre_version(void); extern const char *pcre_version(void);
......
...@@ -115,7 +115,7 @@ PyPcre_exec(self, args) ...@@ -115,7 +115,7 @@ PyPcre_exec(self, args)
return NULL; return NULL;
if (endpos == -1) {endpos = stringlen;} if (endpos == -1) {endpos = stringlen;}
count = pcre_exec(self->regex, self->regex_extra, count = pcre_exec(self->regex, self->regex_extra,
(char *)string+pos, endpos - pos, options, (char *)string, endpos, pos, options,
offsets, sizeof(offsets)/sizeof(int) ); offsets, sizeof(offsets)/sizeof(int) );
/* If an error occurred during the match, and an exception was raised, /* If an error occurred during the match, and an exception was raised,
just return NULL and leave the exception alone. The most likely just return NULL and leave the exception alone. The most likely
...@@ -143,8 +143,6 @@ PyPcre_exec(self, args) ...@@ -143,8 +143,6 @@ PyPcre_exec(self, args)
/* If the group wasn't affected by the match, return -1, -1 */ /* If the group wasn't affected by the match, return -1, -1 */
if (start<0 || count<=i) if (start<0 || count<=i)
{start=end=-1;} {start=end=-1;}
else
{start += pos; end +=pos;}
v=Py_BuildValue("ii", start, end); v=Py_BuildValue("ii", start, end);
if (v==NULL) {Py_DECREF(list); return NULL;} if (v==NULL) {Py_DECREF(list); return NULL;}
PyList_SetItem(list, i, v); PyList_SetItem(list, i, v);
......
...@@ -4424,7 +4424,8 @@ Returns: > 0 => success; value is the number of elements filled in ...@@ -4424,7 +4424,8 @@ Returns: > 0 => success; value is the number of elements filled in
int int
pcre_exec(const pcre *external_re, const pcre_extra *external_extra, pcre_exec(const pcre *external_re, const pcre_extra *external_extra,
const char *subject, int length, int options, int *offsets, int offsetcount) const char *subject, int length, int start_pos, int options,
int *offsets, int offsetcount)
{ {
/* The "volatile" directives are to make gcc -Wall stop complaining /* The "volatile" directives are to make gcc -Wall stop complaining
that these variables can be clobbered by the longjmp. Hopefully that these variables can be clobbered by the longjmp. Hopefully
...@@ -4433,7 +4434,7 @@ int resetcount, ocount; ...@@ -4433,7 +4434,7 @@ int resetcount, ocount;
int first_char = -1; int first_char = -1;
match_data match_block; match_data match_block;
const uschar *start_bits = NULL; const uschar *start_bits = NULL;
const uschar *start_match = (const uschar *)subject; const uschar *start_match = (const uschar *)subject + start_pos;
const uschar *end_subject; const uschar *end_subject;
const real_pcre *re = (const real_pcre *)external_re; const real_pcre *re = (const real_pcre *)external_re;
const real_pcre_extra *extra = (const real_pcre_extra *)external_extra; const real_pcre_extra *extra = (const real_pcre_extra *)external_extra;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment