home *** CD-ROM | disk | FTP | other *** search
- 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
-
-
- *** ../vim-7.3.006/src/if_py_both.h 2010-08-15 21:57:27.000000000 +0200
- --- src/if_py_both.h 2010-09-21 16:00:54.000000000 +0200
- ***************
- *** 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;
- }
-
- /***************/
- --- 143,176 ----
- {
- char_u *ptr;
-
- ! /* 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;
-
- ! if (ga_grow(&io_ga, len + 1) == FAIL)
- ! break;
-
- ! 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;
- ! io_ga.ga_len = 0;
- }
-
- ! /* 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;
- ! }
- }
-
- /***************/
- *** ../vim-7.3.006/src/version.c 2010-09-18 13:36:41.000000000 +0200
- --- src/version.c 2010-09-21 16:49:13.000000000 +0200
- ***************
- *** 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 ///
-