1
0
forked from aniani/vim

updated for version 7.3.007

Problem:    Python code defines global "buffer".  Re-implements a grow-array.
Solution:   Use a grow-array instead of coding the same functionality.  Handle
            out-of-memory situation properly.
This commit is contained in:
Bram Moolenaar 2010-09-21 16:49:37 +02:00
parent 24ea3babed
commit 2eea198564
2 changed files with 25 additions and 51 deletions

View File

@ -34,6 +34,7 @@ Python_Release_Vim(void)
static PyObject *OutputWrite(PyObject *, PyObject *); static PyObject *OutputWrite(PyObject *, PyObject *);
static PyObject *OutputWritelines(PyObject *, PyObject *); static PyObject *OutputWritelines(PyObject *, PyObject *);
/* Function to write a line, points to either msg() or emsg(). */
typedef void (*writefn)(char_u *); typedef void (*writefn)(char_u *);
static void writer(writefn fn, char_u *str, PyInt n); static void writer(writefn fn, char_u *str, PyInt n);
@ -122,52 +123,19 @@ OutputWritelines(PyObject *self, PyObject *args)
return Py_None; return Py_None;
} }
static char_u *buffer = NULL; /* Buffer IO, we write one whole line at a time. */
static PyInt buffer_len = 0; static garray_T io_ga = {0, 0, 1, 80, NULL};
static PyInt buffer_size = 0;
static writefn old_fn = NULL; static writefn old_fn = NULL;
static void
buffer_ensure(PyInt n)
{
PyInt new_size;
char_u *new_buffer;
if (n < buffer_size)
return;
new_size = buffer_size;
while (new_size < n)
new_size += 80;
if (new_size != buffer_size)
{
new_buffer = alloc((unsigned)new_size);
if (new_buffer == NULL)
return;
if (buffer)
{
memcpy(new_buffer, buffer, buffer_len);
vim_free(buffer);
}
buffer = new_buffer;
buffer_size = new_size;
}
}
static void static void
PythonIO_Flush(void) PythonIO_Flush(void)
{ {
if (old_fn && buffer_len) if (old_fn != NULL && io_ga.ga_len > 0)
{ {
buffer[buffer_len] = 0; ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL;
old_fn(buffer); old_fn((char_u *)io_ga.ga_data);
} }
io_ga.ga_len = 0;
buffer_len = 0;
} }
static void static void
@ -175,30 +143,34 @@ writer(writefn fn, char_u *str, PyInt n)
{ {
char_u *ptr; char_u *ptr;
if (fn != old_fn && old_fn != NULL) /* Flush when switching output function. */
if (fn != old_fn)
PythonIO_Flush(); PythonIO_Flush();
old_fn = fn; old_fn = fn;
/* Write each NL separated line. Text after the last NL is kept for
* writing later. */
while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL) while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
{ {
PyInt len = ptr - str; PyInt len = ptr - str;
buffer_ensure(buffer_len + len + 1); if (ga_grow(&io_ga, len + 1) == FAIL)
break;
memcpy(buffer + buffer_len, str, len); mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)len);
buffer_len += len; ((char *)io_ga.ga_data)[io_ga.ga_len + len] = NUL;
buffer[buffer_len] = 0; fn((char_u *)io_ga.ga_data);
fn(buffer);
str = ptr + 1; str = ptr + 1;
n -= len + 1; n -= len + 1;
buffer_len = 0; io_ga.ga_len = 0;
} }
/* Put the remaining text into the buffer for later printing */ /* Put the remaining text into io_ga for later printing. */
buffer_ensure(buffer_len + n + 1); if (n > 0 && ga_grow(&io_ga, n + 1) == OK)
memcpy(buffer + buffer_len, str, n); {
buffer_len += n; mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)n);
io_ga.ga_len += n;
}
} }
/***************/ /***************/

View File

@ -714,6 +714,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
7,
/**/ /**/
6, 6,
/**/ /**/