To: vim_dev@googlegroups.com Subject: Patch 7.4.783 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///