| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.783 |
| 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.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 |
| |
| |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 ---- |
| |
| |
| |
| *** 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))); |
| |
| |
| |
| *** 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 ---- |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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 /// |