aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/change.c222
-rw-r--r--src/nvim/misc1.c114
2 files changed, 100 insertions, 236 deletions
diff --git a/src/nvim/change.c b/src/nvim/change.c
index 18d7af5099..03ecf2539f 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -525,140 +525,118 @@ ins_char(int c)
ins_char_bytes(buf, n);
}
- void
-ins_char_bytes(char_u *buf, int charlen)
+void ins_char_bytes(char_u *buf, size_t charlen)
{
- int c = buf[0];
- int newlen; // nr of bytes inserted
- int oldlen; // nr of bytes deleted (0 when not replacing)
- char_u *p;
- char_u *newp;
- char_u *oldp;
- int linelen; // length of old line including NUL
- colnr_T col;
- linenr_T lnum = curwin->w_cursor.lnum;
- int i;
-
- // Break tabs if needed.
- if (virtual_active() && curwin->w_cursor.coladd > 0)
- coladvance_force(getviscol());
-
- col = curwin->w_cursor.col;
- oldp = ml_get(lnum);
- linelen = (int)STRLEN(oldp) + 1;
-
- // The lengths default to the values for when not replacing.
- oldlen = 0;
- newlen = charlen;
-
- if (State & REPLACE_FLAG)
- {
- if (State & VREPLACE_FLAG)
- {
- colnr_T new_vcol = 0; // init for GCC
- colnr_T vcol;
- int old_list;
-
- // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag.
- // Returns the old value of list, so when finished,
- // curwin->w_p_list should be set back to this.
- old_list = curwin->w_p_list;
- if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL)
- curwin->w_p_list = FALSE;
-
- // In virtual replace mode each character may replace one or more
- // characters (zero if it's a TAB). Count the number of bytes to
- // be deleted to make room for the new character, counting screen
- // cells. May result in adding spaces to fill a gap.
- getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL);
- new_vcol = vcol + chartabsize(buf, vcol);
- while (oldp[col + oldlen] != NUL && vcol < new_vcol)
- {
- vcol += chartabsize(oldp + col + oldlen, vcol);
- // Don't need to remove a TAB that takes us to the right
- // position.
- if (vcol > new_vcol && oldp[col + oldlen] == TAB)
- break;
- oldlen += (*mb_ptr2len)(oldp + col + oldlen);
- // Deleted a bit too much, insert spaces.
- if (vcol > new_vcol)
- newlen += vcol - new_vcol;
- }
- curwin->w_p_list = old_list;
- }
- else if (oldp[col] != NUL)
- {
- // normal replace
- oldlen = (*mb_ptr2len)(oldp + col);
- }
-
+ // Break tabs if needed.
+ if (virtual_active() && curwin->w_cursor.coladd > 0) {
+ coladvance_force(getviscol());
+ }
- // Push the replaced bytes onto the replace stack, so that they can be
- // put back when BS is used. The bytes of a multi-byte character are
- // done the other way around, so that the first byte is popped off
- // first (it tells the byte length of the character).
- replace_push(NUL);
- for (i = 0; i < oldlen; ++i)
- {
- if (has_mbyte)
- i += replace_push_mb(oldp + col + i) - 1;
- else
- replace_push(oldp[col + i]);
- }
+ size_t col = (size_t)curwin->w_cursor.col;
+ linenr_T lnum = curwin->w_cursor.lnum;
+ char_u *oldp = ml_get(lnum);
+ size_t linelen = STRLEN(oldp) + 1; // length of old line including NUL
+
+ // The lengths default to the values for when not replacing.
+ size_t oldlen = 0; // nr of bytes inserted
+ size_t newlen = charlen; // nr of bytes deleted (0 when not replacing)
+
+ if (State & REPLACE_FLAG) {
+ if (State & VREPLACE_FLAG) {
+ // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag.
+ // Returns the old value of list, so when finished,
+ // curwin->w_p_list should be set back to this.
+ int old_list = curwin->w_p_list;
+ if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) {
+ curwin->w_p_list = false;
+ }
+ // In virtual replace mode each character may replace one or more
+ // characters (zero if it's a TAB). Count the number of bytes to
+ // be deleted to make room for the new character, counting screen
+ // cells. May result in adding spaces to fill a gap.
+ colnr_T vcol;
+ getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL);
+ colnr_T new_vcol = vcol + chartabsize(buf, vcol);
+ while (oldp[col + oldlen] != NUL && vcol < new_vcol) {
+ vcol += chartabsize(oldp + col + oldlen, vcol);
+ // Don't need to remove a TAB that takes us to the right
+ // position.
+ if (vcol > new_vcol && oldp[col + oldlen] == TAB) {
+ break;
+ }
+ oldlen += (size_t)(*mb_ptr2len)(oldp + col + oldlen);
+ // Deleted a bit too much, insert spaces.
+ if (vcol > new_vcol) {
+ newlen += (size_t)(vcol - new_vcol);
+ }
+ }
+ curwin->w_p_list = old_list;
+ } else if (oldp[col] != NUL) {
+ // normal replace
+ oldlen = (size_t)(*mb_ptr2len)(oldp + col);
}
- newp = alloc_check((unsigned)(linelen + newlen - oldlen));
- if (newp == NULL)
- return;
- // Copy bytes before the cursor.
- if (col > 0)
- mch_memmove(newp, oldp, (size_t)col);
+ /* Push the replaced bytes onto the replace stack, so that they can be
+ * put back when BS is used. The bytes of a multi-byte character are
+ * done the other way around, so that the first byte is popped off
+ * first (it tells the byte length of the character). */
+ replace_push(NUL);
+ for (size_t i = 0; i < oldlen; i++) {
+ if (has_mbyte) {
+ i += (size_t)replace_push_mb(oldp + col + i) - 1;
+ } else {
+ replace_push(oldp[col + i]);
+ }
+ }
+ }
- // Copy bytes after the changed character(s).
- p = newp + col;
- if (linelen > col + oldlen)
- mch_memmove(p + newlen, oldp + col + oldlen,
- (size_t)(linelen - col - oldlen));
+ char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen));
- // Insert or overwrite the new character.
- mch_memmove(p, buf, charlen);
- i = charlen;
+ // Copy bytes before the cursor.
+ if (col > 0) {
+ memmove(newp, oldp, (size_t)col);
+ }
- // Fill with spaces when necessary.
- while (i < newlen)
- p[i++] = ' ';
+ // Copy bytes after the changed character(s).
+ char_u *p = newp + col;
+ if (linelen > col + oldlen) {
+ memmove(p + newlen, oldp + col + oldlen,
+ (size_t)(linelen - col - oldlen));
+ }
- // Replace the line in the buffer.
- ml_replace(lnum, newp, FALSE);
+ // Insert or overwrite the new character.
+ memmove(p, buf, charlen);
- // mark the buffer as changed and prepare for displaying
- inserted_bytes(lnum, col, newlen - oldlen);
-
- // If we're in Insert or Replace mode and 'showmatch' is set, then briefly
- // show the match for right parens and braces.
- if (p_sm && (State & INSERT)
- && msg_silent == 0
-#ifdef FEAT_INS_EXPAND
- && !ins_compl_active()
-#endif
- )
- {
- if (has_mbyte)
- showmatch(mb_ptr2char(buf));
- else
- showmatch(c);
- }
+ // Fill with spaces when necessary.
+ for (size_t i = charlen; i < newlen; i++) {
+ p[i] = ' ';
+ }
-#ifdef FEAT_RIGHTLEFT
- if (!p_ri || (State & REPLACE_FLAG))
-#endif
- {
- // Normal insert: move cursor right
- curwin->w_cursor.col += charlen;
- }
+ // Replace the line in the buffer.
+ ml_replace(lnum, newp, false);
+
+ // mark the buffer as changed and prepare for displaying
+ changed_bytes(lnum, (colnr_T)col);
+
+ /*
+ * If we're in Insert or Replace mode and 'showmatch' is set, then briefly
+ * show the match for right parens and braces.
+ */
+ if (p_sm && (State & INSERT)
+ && msg_silent == 0
+ && !ins_compl_active()
+ ) {
+ showmatch(utf_ptr2char(buf));
+ }
- // TODO: should try to update w_row here, to avoid recomputing it later.
+ if (!p_ri || (State & REPLACE_FLAG)) {
+ // Normal insert: move cursor right
+ curwin->w_cursor.col += (int)charlen;
+ }
+ /*
+ * TODO: should try to update w_row here, to avoid recomputing it later.
+ */
}
/*
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 76c861e97c..bcb1b47e2d 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -1398,120 +1398,6 @@ void ins_char(int c)
ins_char_bytes(buf, n);
}
-void ins_char_bytes(char_u *buf, size_t charlen)
-{
- // Break tabs if needed.
- if (virtual_active() && curwin->w_cursor.coladd > 0) {
- coladvance_force(getviscol());
- }
-
- size_t col = (size_t)curwin->w_cursor.col;
- linenr_T lnum = curwin->w_cursor.lnum;
- char_u *oldp = ml_get(lnum);
- size_t linelen = STRLEN(oldp) + 1; // length of old line including NUL
-
- // The lengths default to the values for when not replacing.
- size_t oldlen = 0; // nr of bytes inserted
- size_t newlen = charlen; // nr of bytes deleted (0 when not replacing)
-
- if (State & REPLACE_FLAG) {
- if (State & VREPLACE_FLAG) {
- // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag.
- // Returns the old value of list, so when finished,
- // curwin->w_p_list should be set back to this.
- int old_list = curwin->w_p_list;
- if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) {
- curwin->w_p_list = false;
- }
- // In virtual replace mode each character may replace one or more
- // characters (zero if it's a TAB). Count the number of bytes to
- // be deleted to make room for the new character, counting screen
- // cells. May result in adding spaces to fill a gap.
- colnr_T vcol;
- getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL);
- colnr_T new_vcol = vcol + chartabsize(buf, vcol);
- while (oldp[col + oldlen] != NUL && vcol < new_vcol) {
- vcol += chartabsize(oldp + col + oldlen, vcol);
- // Don't need to remove a TAB that takes us to the right
- // position.
- if (vcol > new_vcol && oldp[col + oldlen] == TAB) {
- break;
- }
- oldlen += (size_t)(*mb_ptr2len)(oldp + col + oldlen);
- // Deleted a bit too much, insert spaces.
- if (vcol > new_vcol) {
- newlen += (size_t)(vcol - new_vcol);
- }
- }
- curwin->w_p_list = old_list;
- } else if (oldp[col] != NUL) {
- // normal replace
- oldlen = (size_t)(*mb_ptr2len)(oldp + col);
- }
-
-
- /* Push the replaced bytes onto the replace stack, so that they can be
- * put back when BS is used. The bytes of a multi-byte character are
- * done the other way around, so that the first byte is popped off
- * first (it tells the byte length of the character). */
- replace_push(NUL);
- for (size_t i = 0; i < oldlen; i++) {
- if (has_mbyte) {
- i += (size_t)replace_push_mb(oldp + col + i) - 1;
- } else {
- replace_push(oldp[col + i]);
- }
- }
- }
-
- char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen));
-
- // Copy bytes before the cursor.
- if (col > 0) {
- memmove(newp, oldp, (size_t)col);
- }
-
- // Copy bytes after the changed character(s).
- char_u *p = newp + col;
- if (linelen > col + oldlen) {
- memmove(p + newlen, oldp + col + oldlen,
- (size_t)(linelen - col - oldlen));
- }
-
- // Insert or overwrite the new character.
- memmove(p, buf, charlen);
-
- // Fill with spaces when necessary.
- for (size_t i = charlen; i < newlen; i++) {
- p[i] = ' ';
- }
-
- // Replace the line in the buffer.
- ml_replace(lnum, newp, false);
-
- // mark the buffer as changed and prepare for displaying
- changed_bytes(lnum, (colnr_T)col);
-
- /*
- * If we're in Insert or Replace mode and 'showmatch' is set, then briefly
- * show the match for right parens and braces.
- */
- if (p_sm && (State & INSERT)
- && msg_silent == 0
- && !ins_compl_active()
- ) {
- showmatch(utf_ptr2char(buf));
- }
-
- if (!p_ri || (State & REPLACE_FLAG)) {
- // Normal insert: move cursor right
- curwin->w_cursor.col += (int)charlen;
- }
- /*
- * TODO: should try to update w_row here, to avoid recomputing it later.
- */
-}
-
/*
* Insert a string at the cursor position.
* Note: Does NOT handle Replace mode.