diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2008-01-08 14:30:55 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2008-01-08 14:30:55 (GMT) |
commit | e0a49b6e05d8408c8a45b7dbe2045ec833602d5b (patch) | |
tree | 24f906c81fcedc31ce7a38cdee76779f1a903856 /Modules/pyexpat.c | |
parent | 52b25795c02442fc40f8932d05e5d728266339a4 (diff) | |
download | cpython-e0a49b6e05d8408c8a45b7dbe2045ec833602d5b.zip cpython-e0a49b6e05d8408c8a45b7dbe2045ec833602d5b.tar.gz cpython-e0a49b6e05d8408c8a45b7dbe2045ec833602d5b.tar.bz2 |
Patch 1137: allow assigning to .buffer_size attribute of PyExpat.parser objects
Diffstat (limited to 'Modules/pyexpat.c')
-rw-r--r-- | Modules/pyexpat.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 2d2c4c5..01971b7 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1649,6 +1649,50 @@ xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v) self->specified_attributes = 0; return 0; } + + if (strcmp(name, "buffer_size") == 0) { + long new_buffer_size; + if (!PyInt_Check(v)) { + PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer"); + return -1; + } + + new_buffer_size=PyInt_AS_LONG(v); + /* trivial case -- no change */ + if (new_buffer_size == self->buffer_size) { + return 0; + } + + if (new_buffer_size <= 0) { + PyErr_SetString(PyExc_ValueError, "buffer_size must be greater than zero"); + return -1; + } + + /* check maximum */ + if (new_buffer_size > INT_MAX) { + char errmsg[100]; + sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX); + PyErr_SetString(PyExc_ValueError, errmsg); + return -1; + } + + if (self->buffer != NULL) { + /* there is already a buffer */ + if (self->buffer_used != 0) { + flush_character_buffer(self); + } + /* free existing buffer */ + free(self->buffer); + } + self->buffer = malloc(new_buffer_size); + if (self->buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + self->buffer_size = new_buffer_size; + return 0; + } + if (strcmp(name, "CharacterDataHandler") == 0) { /* If we're changing the character data handler, flush all * cached data with the old handler. Not sure there's a |