*** python2.5-2.5/Modules/pyexpat.c 2006-07-06 07:13:22.000000000 +0200 --- pyexpat.c_achim 2007-09-08 01:01:38.000000000 +0200 *************** *** 1611,1620 **** --- 1611,1688 ---- free(self->buffer); self->buffer = NULL; } return 0; } + /* added code */ + if (strcmp(name, "buffer_size") == 0) { + long new_buffer_size; + if (PyInt_Check(v)==0) { + PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer"); + return -1; + } + new_buffer_size=PyInt_AS_LONG(v); + if (new_buffer_size<=0) { + PyErr_SetString(PyExc_ValueError, "buffer_size must be greater zero"); + return -1; + } + /* trivial case */ + if (new_buffer_size==self->buffer_size) return 0; + + /* check maximum */ + if (new_buffer_size>INT_MAX) { + PyErr_SetString(PyExc_ValueError, "buffer_size must not be greater than INT_MAX"); + return -1; + } + if (self->buffer!=NULL) { + /* there is a buffer */ + if (self->buffer_used==0) { + /* normal case, you can guess required size before buffer is filled */ + free(self->buffer); + self->buffer = malloc(new_buffer_size); + if (self->buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + } + else { + /* have to handle existing data, trying to avoid immediate flush */ + if (new_buffer_size >= self->buffer_used) { + /* try a realloc (assume there is no trailing zero) */ + void* new_buffer=realloc((void*)self->buffer, new_buffer_size); + if (new_buffer!=NULL) { + self->buffer=new_buffer; + } + else { + /* realloc failed, do a flush and take new buffer */ + flush_character_buffer(self); + free(self->buffer); + self->buffer = malloc(new_buffer_size); + if (self->buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + } + } + else { + /* simplea aproach: do a flush and take new buffer */ + flush_character_buffer(self); + free(self->buffer); + self->buffer = malloc(new_buffer_size); + if (self->buffer == NULL) { + PyErr_NoMemory(); + return -1; + } + } + + } /* existing data */ + + } /* buffer already allocated */ + self->buffer_size=new_buffer_size; + return 0; + } + /* end added code */ if (strcmp(name, "namespace_prefixes") == 0) { if (PyObject_IsTrue(v)) self->ns_prefixes = 1; else self->ns_prefixes = 0;