| To: vim-dev@vim.org |
| Subject: Patch 7.3.007 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 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. |
| Files: src/if_py_both.h |
| |
| |
| |
| |
| |
| *** 34,39 **** |
| --- 34,40 ---- |
| 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,173 **** |
| return Py_None; |
| } |
| |
| ! static char_u *buffer = NULL; |
| ! static PyInt buffer_len = 0; |
| ! static PyInt buffer_size = 0; |
| ! |
| 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) |
| { |
| ! buffer[buffer_len] = 0; |
| ! old_fn(buffer); |
| } |
| ! |
| ! buffer_len = 0; |
| } |
| |
| static void |
| --- 123,141 ---- |
| return Py_None; |
| } |
| |
| ! /* 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 |
| PythonIO_Flush(void) |
| { |
| ! if (old_fn != NULL && io_ga.ga_len > 0) |
| { |
| ! ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL; |
| ! old_fn((char_u *)io_ga.ga_data); |
| } |
| ! io_ga.ga_len = 0; |
| } |
| |
| static void |
| |
| *** 175,204 **** |
| { |
| char_u *ptr; |
| |
| ! if (fn != old_fn && old_fn != NULL) |
| PythonIO_Flush(); |
| - |
| old_fn = fn; |
| |
| while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL) |
| { |
| PyInt len = ptr - str; |
| |
| ! buffer_ensure(buffer_len + len + 1); |
| |
| ! memcpy(buffer + buffer_len, str, len); |
| ! buffer_len += len; |
| ! buffer[buffer_len] = 0; |
| ! fn(buffer); |
| str = ptr + 1; |
| n -= len + 1; |
| ! buffer_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; |
| } |
| |
| / |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 7, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 180. You maintain more than six e-mail addresses. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |