patch for re.sub bug, by AMK.

This commit is contained in:
Guido van Rossum 1998-03-10 04:55:29 +00:00
parent 193338afeb
commit 816671c666
3 changed files with 7 additions and 6 deletions

View file

@ -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);

View file

@ -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)
/* 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);

View file

@ -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;
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;