Patch 7.4.783
Problem:    copy_chars() and copy_spaces() are inefficient.
Solution:   Use memset() instead. (Dominique Pelle)
Files:      src/ex_getln.c, src/misc2.c, src/ops.c, src/proto/misc2.pro,
            src/screen.c


*** ../vim-7.4.782/src/ex_getln.c       2015-07-17 13:03:42.100357542 +0200
--- src/ex_getln.c      2015-07-17 13:11:12.608078272 +0200
***************
*** 250,256 ****
      /* autoindent for :insert and :append */
      if (firstc <= 0)
      {
!       copy_spaces(ccline.cmdbuff, indent);
        ccline.cmdbuff[indent] = NUL;
        ccline.cmdpos = indent;
        ccline.cmdspos = indent;
--- 250,256 ----
      /* autoindent for :insert and :append */
      if (firstc <= 0)
      {
!       vim_memset(ccline.cmdbuff, ' ', indent);
        ccline.cmdbuff[indent] = NUL;
        ccline.cmdpos = indent;
        ccline.cmdspos = indent;
*** ../vim-7.4.782/src/misc2.c  2015-07-17 13:03:42.104357503 +0200
--- src/misc2.c 2015-07-17 13:11:12.608078272 +0200
***************
*** 1600,1639 ****
  #endif
  
  /*
-  * copy a space a number of times
-  */
-     void
- copy_spaces(ptr, count)
-     char_u    *ptr;
-     size_t    count;
- {
-     size_t    i = count;
-     char_u    *p = ptr;
- 
-     while (i--)
-       *p++ = ' ';
- }
- 
- #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
- /*
-  * Copy a character a number of times.
-  * Does not work for multi-byte characters!
-  */
-     void
- copy_chars(ptr, count, c)
-     char_u    *ptr;
-     size_t    count;
-     int               c;
- {
-     size_t    i = count;
-     char_u    *p = ptr;
- 
-     while (i--)
-       *p++ = c;
- }
- #endif
- 
- /*
   * delete spaces at the end of a string
   */
      void
--- 1600,1605 ----
*** ../vim-7.4.782/src/ops.c    2015-07-17 13:03:42.108357465 +0200
--- src/ops.c   2015-07-17 13:11:12.612078233 +0200
***************
*** 442,449 ****
            return;
        vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + len));
        mch_memmove(newp, oldp, (size_t)bd.textcol);
!       copy_chars(newp + bd.textcol, (size_t)i, TAB);
!       copy_spaces(newp + bd.textcol + i, (size_t)j);
        /* the end */
        mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
      }
--- 442,449 ----
            return;
        vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + len));
        mch_memmove(newp, oldp, (size_t)bd.textcol);
!       vim_memset(newp + bd.textcol, TAB, (size_t)i);
!       vim_memset(newp + bd.textcol + i, ' ', (size_t)j);
        /* the end */
        mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
      }
***************
*** 535,541 ****
        if (newp == NULL)
            return;
        mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
!       copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill);
        STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
      }
      /* replace the line */
--- 535,541 ----
        if (newp == NULL)
            return;
        mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
!       vim_memset(newp + (verbatim_copy_end - oldp), ' ', (size_t)fill);
        STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
      }
      /* replace the line */
***************
*** 638,644 ****
        oldp += offset;
  
        /* insert pre-padding */
!       copy_spaces(newp + offset, (size_t)spaces);
  
        /* copy the new text */
        mch_memmove(newp + offset + spaces, s, (size_t)s_len);
--- 638,644 ----
        oldp += offset;
  
        /* insert pre-padding */
!       vim_memset(newp + offset, ' ', (size_t)spaces);
  
        /* copy the new text */
        mch_memmove(newp + offset + spaces, s, (size_t)s_len);
***************
*** 647,653 ****
        if (spaces && !bdp->is_short)
        {
            /* insert post-padding */
!           copy_spaces(newp + offset + spaces, (size_t)(p_ts - spaces));
            /* We're splitting a TAB, don't copy it. */
            oldp++;
            /* We allowed for that TAB, remember this now */
--- 647,653 ----
        if (spaces && !bdp->is_short)
        {
            /* insert post-padding */
!           vim_memset(newp + offset + spaces, ' ', (size_t)(p_ts - spaces));
            /* We're splitting a TAB, don't copy it. */
            oldp++;
            /* We allowed for that TAB, remember this now */
***************
*** 1831,1837 ****
            /* copy up to deleted part */
            mch_memmove(newp, oldp, (size_t)bd.textcol);
            /* insert spaces */
!           copy_spaces(newp + bd.textcol,
                                     (size_t)(bd.startspaces + bd.endspaces));
            /* copy the part after the deleted part */
            oldp += bd.textcol + bd.textlen;
--- 1831,1837 ----
            /* copy up to deleted part */
            mch_memmove(newp, oldp, (size_t)bd.textcol);
            /* insert spaces */
!           vim_memset(newp + bd.textcol, ' ',
                                     (size_t)(bd.startspaces + bd.endspaces));
            /* copy the part after the deleted part */
            oldp += bd.textcol + bd.textlen;
***************
*** 2132,2138 ****
            mch_memmove(newp, oldp, (size_t)bd.textcol);
            oldp += bd.textcol + bd.textlen;
            /* insert pre-spaces */
!           copy_spaces(newp + bd.textcol, (size_t)bd.startspaces);
            /* insert replacement chars CHECK FOR ALLOCATED SPACE */
            /* -1/-2 is used for entering CR literally. */
            if (had_ctrl_v_cr || (c != '\r' && c != '\n'))
--- 2132,2138 ----
            mch_memmove(newp, oldp, (size_t)bd.textcol);
            oldp += bd.textcol + bd.textlen;
            /* insert pre-spaces */
!           vim_memset(newp + bd.textcol, ' ', (size_t)bd.startspaces);
            /* insert replacement chars CHECK FOR ALLOCATED SPACE */
            /* -1/-2 is used for entering CR literally. */
            if (had_ctrl_v_cr || (c != '\r' && c != '\n'))
***************
*** 2146,2156 ****
                }
                else
  #endif
!                   copy_chars(newp + STRLEN(newp), (size_t)numc, c);
                if (!bd.is_short)
                {
                    /* insert post-spaces */
!                   copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces);
                    /* copy the part after the changed part */
                    STRMOVE(newp + STRLEN(newp), oldp);
                }
--- 2146,2156 ----
                }
                else
  #endif
!                   vim_memset(newp + STRLEN(newp), c, (size_t)numc);
                if (!bd.is_short)
                {
                    /* insert post-spaces */
!                   vim_memset(newp + STRLEN(newp), ' ', (size_t)bd.endspaces);
                    /* copy the part after the changed part */
                    STRMOVE(newp + STRLEN(newp), oldp);
                }
***************
*** 2831,2837 ****
                        mch_memmove(newp, oldp, (size_t)bd.textcol);
                        offset = bd.textcol;
  # ifdef FEAT_VIRTUALEDIT
!                       copy_spaces(newp + offset, (size_t)vpos.coladd);
                        offset += vpos.coladd;
  # endif
                        mch_memmove(newp + offset, ins_text, (size_t)ins_len);
--- 2831,2837 ----
                        mch_memmove(newp, oldp, (size_t)bd.textcol);
                        offset = bd.textcol;
  # ifdef FEAT_VIRTUALEDIT
!                       vim_memset(newp + offset, ' ', (size_t)vpos.coladd);
                        offset += vpos.coladd;
  # endif
                        mch_memmove(newp + offset, ins_text, (size_t)ins_len);
***************
*** 3272,3282 ****
                                                                      == NULL)
        return FAIL;
      y_current->y_array[y_idx] = pnew;
!     copy_spaces(pnew, (size_t)bd->startspaces);
      pnew += bd->startspaces;
      mch_memmove(pnew, bd->textstart, (size_t)bd->textlen);
      pnew += bd->textlen;
!     copy_spaces(pnew, (size_t)bd->endspaces);
      pnew += bd->endspaces;
      *pnew = NUL;
      return OK;
--- 3272,3282 ----
                                                                      == NULL)
        return FAIL;
      y_current->y_array[y_idx] = pnew;
!     vim_memset(pnew, ' ', (size_t)bd->startspaces);
      pnew += bd->startspaces;
      mch_memmove(pnew, bd->textstart, (size_t)bd->textlen);
      pnew += bd->textlen;
!     vim_memset(pnew, ' ', (size_t)bd->endspaces);
      pnew += bd->endspaces;
      *pnew = NUL;
      return OK;
***************
*** 3690,3696 ****
            mch_memmove(ptr, oldp, (size_t)bd.textcol);
            ptr += bd.textcol;
            /* may insert some spaces before the new text */
!           copy_spaces(ptr, (size_t)bd.startspaces);
            ptr += bd.startspaces;
            /* insert the new text */
            for (j = 0; j < count; ++j)
--- 3690,3696 ----
            mch_memmove(ptr, oldp, (size_t)bd.textcol);
            ptr += bd.textcol;
            /* may insert some spaces before the new text */
!           vim_memset(ptr, ' ', (size_t)bd.startspaces);
            ptr += bd.startspaces;
            /* insert the new text */
            for (j = 0; j < count; ++j)
***************
*** 3701,3712 ****
                /* insert block's trailing spaces only if there's text behind */
                if ((j < count - 1 || !shortline) && spaces)
                {
!                   copy_spaces(ptr, (size_t)spaces);
                    ptr += spaces;
                }
            }
            /* may insert some spaces after the new text */
!           copy_spaces(ptr, (size_t)bd.endspaces);
            ptr += bd.endspaces;
            /* move the text after the cursor to the end of the line. */
            mch_memmove(ptr, oldp + bd.textcol + delcount,
--- 3701,3712 ----
                /* insert block's trailing spaces only if there's text behind */
                if ((j < count - 1 || !shortline) && spaces)
                {
!                   vim_memset(ptr, ' ', (size_t)spaces);
                    ptr += spaces;
                }
            }
            /* may insert some spaces after the new text */
!           vim_memset(ptr, ' ', (size_t)bd.endspaces);
            ptr += bd.endspaces;
            /* move the text after the cursor to the end of the line. */
            mch_memmove(ptr, oldp + bd.textcol + delcount,
***************
*** 4522,4528 ****
        if (spaces[t] > 0)
        {
            cend -= spaces[t];
!           copy_spaces(cend, (size_t)(spaces[t]));
        }
        mark_col_adjust(curwin->w_cursor.lnum + t, (colnr_T)0, (linenr_T)-t,
                         (long)(cend - newp + spaces[t] - (curr - curr_start)));
--- 4522,4528 ----
        if (spaces[t] > 0)
        {
            cend -= spaces[t];
!           vim_memset(cend, ' ', (size_t)(spaces[t]));
        }
        mark_col_adjust(curwin->w_cursor.lnum + t, (colnr_T)0, (linenr_T)-t,
                         (long)(cend - newp + spaces[t] - (curr - curr_start)));
*** ../vim-7.4.782/src/proto/misc2.pro  2014-08-10 13:34:59.064785459 +0200
--- src/proto/misc2.pro 2015-07-17 13:11:12.612078233 +0200
***************
*** 37,44 ****
  char_u *vim_strnsave_up __ARGS((char_u *string, int len));
  void vim_strup __ARGS((char_u *p));
  char_u *strup_save __ARGS((char_u *orig));
- void copy_spaces __ARGS((char_u *ptr, size_t count));
- void copy_chars __ARGS((char_u *ptr, size_t count, int c));
  void del_trailing_spaces __ARGS((char_u *ptr));
  void vim_strncpy __ARGS((char_u *to, char_u *from, size_t len));
  void vim_strcat __ARGS((char_u *to, char_u *from, size_t tosize));
--- 37,42 ----
*** ../vim-7.4.782/src/screen.c 2015-06-10 12:16:41.926648740 +0200
--- src/screen.c        2015-07-17 13:11:12.612078233 +0200
***************
*** 2833,2839 ****
      int               fdc = compute_foldcolumn(wp, 0);
  
      /* Init to all spaces. */
!     copy_spaces(p, (size_t)fdc);
  
      level = win_foldinfo.fi_level;
      if (level > 0)
--- 2833,2839 ----
      int               fdc = compute_foldcolumn(wp, 0);
  
      /* Init to all spaces. */
!     vim_memset(p, ' ', (size_t)fdc);
  
      level = win_foldinfo.fi_level;
      if (level > 0)
*** ../vim-7.4.782/src/version.c        2015-07-17 13:03:42.108357465 +0200
--- src/version.c       2015-07-17 13:06:43.742631736 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     783,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
228. You spend Saturday night making the counter on your home page
     pass that 2000 mark.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui