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 -- [email protected] -- 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    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui