[Python-checkins] CVS: python/dist/src/Modules _sre.c,2.55,2.56 sre.h,2.20,2.21
Fredrik Lundh
effbot@users.sourceforge.net
Mon, 02 Jul 2001 09:42:52 -0700
Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv29536/Modules
Modified Files:
_sre.c sre.h
Log Message:
merged with pythonware's SRE 2.1.1 codebase
Index: _sre.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_sre.c,v
retrieving revision 2.55
retrieving revision 2.56
diff -C2 -r2.55 -r2.56
*** _sre.c 2001/04/15 19:00:58 2.55
--- _sre.c 2001/07/02 16:42:49 2.56
***************
*** 29,32 ****
--- 29,34 ----
* 2001-03-20 fl lots of fixes for 2.1b2
* 2001-04-15 fl export copyright as Python attribute, not global
+ * 2001-04-28 fl added __copy__ methods (work in progress)
+ * 2001-05-14 fl fixes for 1.5.2
*
* Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved.
***************
*** 44,50 ****
static char copyright[] =
! " SRE 2.1b2 Copyright (c) 1997-2001 by Secret Labs AB ";
#include "Python.h"
#include "sre.h"
--- 46,53 ----
static char copyright[] =
! " SRE 2.1.1 Copyright (c) 1997-2001 by Secret Labs AB ";
#include "Python.h"
+ #include "structmember.h" /* offsetof */
#include "sre.h"
***************
*** 87,90 ****
--- 90,96 ----
#undef USE_INLINE
+ /* enables copy/deepcopy handling (work in progress) */
+ #undef USE_BUILTIN_COPY
+
#if PY_VERSION_HEX < 0x01060000
#define PyObject_DEL(op) PyMem_DEL((op))
***************
*** 445,448 ****
--- 451,455 ----
return this == that;
+ #if defined(HAVE_UNICODE)
case SRE_AT_UNI_BOUNDARY:
if (state->beginning == state->end)
***************
*** 462,465 ****
--- 469,474 ----
SRE_UNI_IS_WORD((int) ptr[0]) : 0;
return this == that;
+ #endif
+
}
***************
*** 1287,1290 ****
--- 1296,1301 ----
return NULL;
+ self->codesize = n;
+
for (i = 0; i < n; i++) {
PyObject *o = PyList_GET_ITEM(code, i);
***************
*** 1845,1848 ****
--- 1856,1895 ----
}
+ static PyObject*
+ pattern_copy(PatternObject* self, PyObject* args)
+ {
+ #if USE_BUILTIN_COPY
+ PatternObject* copy;
+ int offset;
+
+ /* work in progress */
+
+ copy = PyObject_NEW_VAR(PatternObject, &Pattern_Type, self->codesize);
+ if (!copy)
+ return NULL;
+
+ offset = offsetof(PatternObject, groups);
+
+ Py_XINCREF(self->groupindex);
+ Py_XINCREF(self->indexgroup);
+ Py_XINCREF(self->pattern);
+
+ memcpy((char*) copy + offset, (char*) self + offset,
+ sizeof(PatternObject) + self->codesize * sizeof(SRE_CODE) - offset);
+
+ return (PyObject*) copy;
+ #else
+ PyErr_SetString(PyExc_TypeError, "cannot copy this pattern object");
+ return NULL;
+ #endif
+ }
+
+ static PyObject*
+ pattern_deepcopy(PatternObject* self, PyObject* args)
+ {
+ PyErr_SetString(PyExc_TypeError, "cannot deepcopy this pattern object");
+ return NULL;
+ }
+
static PyMethodDef pattern_methods[] = {
{"match", (PyCFunction) pattern_match, METH_VARARGS|METH_KEYWORDS},
***************
*** 1852,1857 ****
{"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS},
{"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS},
- /* experimental */
{"scanner", (PyCFunction) pattern_scanner, METH_VARARGS},
{NULL, NULL}
};
--- 1899,1905 ----
{"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS},
{"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS},
{"scanner", (PyCFunction) pattern_scanner, METH_VARARGS},
+ {"__copy__", (PyCFunction) pattern_copy, METH_VARARGS},
+ {"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_VARARGS},
{NULL, NULL}
};
***************
*** 2212,2215 ****
--- 2260,2303 ----
}
+ static PyObject*
+ match_copy(MatchObject* self, PyObject* args)
+ {
+ #if USE_BUILTIN_COPY
+ MatchObject* copy;
+ int slots, offset;
+
+ /* works in progress */
+
+ slots = 2 * (self->pattern->groups+1);
+
+ copy = PyObject_NEW_VAR(MatchObject, &Match_Type, slots);
+ if (!copy)
+ return NULL;
+
+ /* this value a constant, but any compiler should be able to
+ figure that out all by itself */
+ offset = offsetof(MatchObject, string);
+
+ Py_XINCREF(self->pattern);
+ Py_XINCREF(self->string);
+ Py_XINCREF(self->regs);
+
+ memcpy((char*) copy + offset, (char*) self + offset,
+ sizeof(MatchObject) + slots * sizeof(int) - offset);
+
+ return (PyObject*) copy;
+ #else
+ PyErr_SetString(PyExc_TypeError, "cannot deepcopy this match object");
+ return NULL;
+ #endif
+ }
+
+ static PyObject*
+ match_deepcopy(MatchObject* self, PyObject* args)
+ {
+ PyErr_SetString(PyExc_TypeError, "cannot deepcopy this match object");
+ return NULL;
+ }
+
static PyMethodDef match_methods[] = {
{"group", (PyCFunction) match_group, METH_VARARGS},
***************
*** 2220,2223 ****
--- 2308,2313 ----
{"groupdict", (PyCFunction) match_groupdict, METH_VARARGS|METH_KEYWORDS},
{"expand", (PyCFunction) match_expand, METH_VARARGS},
+ {"__copy__", (PyCFunction) match_copy, METH_VARARGS},
+ {"__deepcopy__", (PyCFunction) match_deepcopy, METH_VARARGS},
{NULL, NULL}
};
Index: sre.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/sre.h,v
retrieving revision 2.20
retrieving revision 2.21
diff -C2 -r2.20 -r2.21
*** sre.h 2001/06/27 18:59:43 2.20
--- sre.h 2001/07/02 16:42:49 2.21
***************
*** 4,8 ****
* regular expression matching engine
*
! * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved.
*
* See the _sre.c file for information on usage and redistribution.
--- 4,8 ----
* regular expression matching engine
*
! * Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved.
*
* See the _sre.c file for information on usage and redistribution.
***************
*** 22,28 ****
#endif
typedef struct {
PyObject_VAR_HEAD
! int groups;
PyObject* groupindex;
PyObject* indexgroup;
--- 22,30 ----
#endif
+ #define SRE_CODE unsigned short
+
typedef struct {
PyObject_VAR_HEAD
! int groups; /* must be first! */
PyObject* groupindex;
PyObject* indexgroup;
***************
*** 31,34 ****
--- 33,37 ----
int flags; /* flags used when compiling pattern source */
/* pattern code */
+ int codesize;
SRE_CODE code[1];
} PatternObject;
***************
*** 38,42 ****
typedef struct {
PyObject_VAR_HEAD
! PyObject* string; /* link to the target string */
PyObject* regs; /* cached list of matching spans */
PatternObject* pattern; /* link to the regex (pattern) object */
--- 41,45 ----
typedef struct {
PyObject_VAR_HEAD
! PyObject* string; /* link to the target string (must be first) */
PyObject* regs; /* cached list of matching spans */
PatternObject* pattern; /* link to the regex (pattern) object */