# HG changeset patch # User Bram Moolenaar # Date 1285080577 -7200 # Node ID 2cdbc91795ca0d15343fe954ae2af71f830f9656 # Parent e8a482a7fa6c0bf25f009b096202795400c9681a 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. diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -34,6 +34,7 @@ Python_Release_Vim(void) static PyObject *OutputWrite(PyObject *, PyObject *); static PyObject *OutputWritelines(PyObject *, PyObject *); +/* Function to write a line, points to either msg() or emsg(). */ typedef void (*writefn)(char_u *); static void writer(writefn fn, char_u *str, PyInt n); @@ -122,52 +123,19 @@ OutputWritelines(PyObject *self, PyObjec return Py_None; } -static char_u *buffer = NULL; -static PyInt buffer_len = 0; -static PyInt buffer_size = 0; - +/* Buffer IO, we write one whole line at a time. */ +static garray_T io_ga = {0, 0, 1, 80, 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 PythonIO_Flush(void) { - if (old_fn && buffer_len) + if (old_fn != NULL && io_ga.ga_len > 0) { - buffer[buffer_len] = 0; - old_fn(buffer); + ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL; + old_fn((char_u *)io_ga.ga_data); } - - buffer_len = 0; + io_ga.ga_len = 0; } static void @@ -175,30 +143,34 @@ writer(writefn fn, char_u *str, PyInt n) { char_u *ptr; - if (fn != old_fn && old_fn != NULL) + /* Flush when switching output function. */ + if (fn != old_fn) PythonIO_Flush(); - 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) { 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); - buffer_len += len; - buffer[buffer_len] = 0; - fn(buffer); + mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)len); + ((char *)io_ga.ga_data)[io_ga.ga_len + len] = NUL; + fn((char_u *)io_ga.ga_data); str = ptr + 1; n -= len + 1; - buffer_len = 0; + io_ga.ga_len = 0; } - /* Put the remaining text into the buffer for later printing */ - buffer_ensure(buffer_len + n + 1); - memcpy(buffer + buffer_len, str, n); - buffer_len += n; + /* Put the remaining text into io_ga for later printing. */ + if (n > 0 && ga_grow(&io_ga, n + 1) == OK) + { + mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)n); + io_ga.ga_len += n; + } } /***************/ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 7, +/**/ 6, /**/ 5,