aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/change.c13
-rw-r--r--src/nvim/edit.c18
-rw-r--r--src/nvim/insexpand.c19
-rw-r--r--src/nvim/ops.c34
-rw-r--r--src/nvim/textformat.c2
5 files changed, 44 insertions, 42 deletions
diff --git a/src/nvim/change.c b/src/nvim/change.c
index cb5e2b0f65..27749576d7 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -804,9 +804,8 @@ void ins_char_bytes(char *buf, size_t charlen)
/// Insert a string at the cursor position.
/// Note: Does NOT handle Replace mode.
/// Caller must have prepared for undo.
-void ins_str(char *s)
+void ins_str(char *s, size_t slen)
{
- int newlen = (int)strlen(s);
linenr_T lnum = curwin->w_cursor.lnum;
if (virtual_active(curwin) && curwin->w_cursor.coladd > 0) {
@@ -817,17 +816,17 @@ void ins_str(char *s)
char *oldp = ml_get(lnum);
int oldlen = ml_get_len(lnum);
- char *newp = xmalloc((size_t)oldlen + (size_t)newlen + 1);
+ char *newp = xmalloc((size_t)oldlen + slen + 1);
if (col > 0) {
memmove(newp, oldp, (size_t)col);
}
- memmove(newp + col, s, (size_t)newlen);
+ memmove(newp + col, s, slen);
int bytes = oldlen - col + 1;
assert(bytes >= 0);
- memmove(newp + col + newlen, oldp + col, (size_t)bytes);
+ memmove(newp + col + slen, oldp + col, (size_t)bytes);
ml_replace(lnum, newp, false);
- inserted_bytes(lnum, col, 0, newlen);
- curwin->w_cursor.col += newlen;
+ inserted_bytes(lnum, col, 0, (int)slen);
+ curwin->w_cursor.col += (int)slen;
}
// Delete one character under the cursor.
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index a127df43c9..6277cd83b6 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -1737,11 +1737,11 @@ void change_indent(int type, int amount, int round, bool call_changed_bytes)
// the right screen column.
if (vcol != (int)curwin->w_virtcol) {
curwin->w_cursor.col = (colnr_T)new_cursor_col;
- size_t i = (size_t)(curwin->w_virtcol - vcol);
- char *ptr = xmallocz(i);
- memset(ptr, ' ', i);
- new_cursor_col += (int)i;
- ins_str(ptr);
+ const size_t ptrlen = (size_t)(curwin->w_virtcol - vcol);
+ char *ptr = xmallocz(ptrlen);
+ memset(ptr, ' ', ptrlen);
+ new_cursor_col += (int)ptrlen;
+ ins_str(ptr, ptrlen);
xfree(ptr);
}
@@ -2014,7 +2014,7 @@ static void insert_special(int c, int allow_modmask, int ctrlv)
return;
}
p[len - 1] = NUL;
- ins_str(p);
+ ins_str(p, (size_t)(len - 1));
AppendToRedobuffLit(p, -1);
ctrlv = false;
}
@@ -2195,7 +2195,7 @@ void insertchar(int c, int flags, int second_indent)
do_digraph(-1); // clear digraphs
do_digraph((uint8_t)buf[i - 1]); // may be the start of a digraph
buf[i] = NUL;
- ins_str(buf);
+ ins_str(buf, (size_t)i);
if (flags & INSCHAR_CTRLV) {
redo_literal((uint8_t)(*buf));
i = 1;
@@ -3860,7 +3860,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
if (State & VREPLACE_FLAG) {
ins_char(' ');
} else {
- ins_str(" ");
+ ins_str(S_LEN(" "));
if ((State & REPLACE_FLAG)) {
replace_push_nul();
}
@@ -4270,7 +4270,7 @@ static bool ins_tab(void)
if (State & VREPLACE_FLAG) {
ins_char(' ');
} else {
- ins_str(" ");
+ ins_str(S_LEN(" "));
if (State & REPLACE_FLAG) { // no char replaced
replace_push_nul();
}
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c
index e33e48e1d2..4ed83312ef 100644
--- a/src/nvim/insexpand.c
+++ b/src/nvim/insexpand.c
@@ -3781,17 +3781,16 @@ void ins_compl_delete(bool new_leader)
curwin->w_cursor.col = compl_ins_end_col;
}
- char *remaining = NULL;
+ String remaining = STRING_INIT;
if (curwin->w_cursor.lnum > compl_lnum) {
if (curwin->w_cursor.col < get_cursor_line_len()) {
- char *line = get_cursor_line_ptr();
- remaining = xstrdup(line + curwin->w_cursor.col);
+ remaining = cbuf_to_string(get_cursor_pos_ptr(), (size_t)get_cursor_pos_len());
}
while (curwin->w_cursor.lnum > compl_lnum) {
if (ml_delete(curwin->w_cursor.lnum, false) == FAIL) {
- if (remaining) {
- XFREE_CLEAR(remaining);
+ if (remaining.data) {
+ xfree(remaining.data);
}
return;
}
@@ -3804,8 +3803,8 @@ void ins_compl_delete(bool new_leader)
if ((int)curwin->w_cursor.col > col) {
if (stop_arrow() == FAIL) {
- if (remaining) {
- XFREE_CLEAR(remaining);
+ if (remaining.data) {
+ xfree(remaining.data);
}
return;
}
@@ -3813,11 +3812,11 @@ void ins_compl_delete(bool new_leader)
compl_ins_end_col = curwin->w_cursor.col;
}
- if (remaining != NULL) {
+ if (remaining.data != NULL) {
orig_col = curwin->w_cursor.col;
- ins_str(remaining);
+ ins_str(remaining.data, remaining.size);
curwin->w_cursor.col = orig_col;
- xfree(remaining);
+ xfree(remaining.data);
}
// TODO(vim): is this sufficient for redrawing? Redrawing everything
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 6c437bcb2c..3e2fa13cdd 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -4513,8 +4513,6 @@ void op_addsub(oparg_T *oap, linenr_T Prenum1, bool g_cmd)
/// @return true if some character was changed.
bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
{
- char *buf1 = NULL;
- char buf2[NUMBUFLEN];
int pre; // 'X' or 'x': hex; '0': octal; 'B' or 'b': bin
static bool hexupper = false; // 0xABC
uvarnumber_T n;
@@ -4778,7 +4776,7 @@ bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
// Prepare the leading characters in buf1[].
// When there are many leading zeros it could be very long.
// Allocate a bit too much.
- buf1 = xmalloc((size_t)length + NUMBUFLEN);
+ char *buf1 = xmalloc((size_t)length + NUMBUFLEN);
ptr = buf1;
if (negative && (!visual || was_positive)) {
*ptr++ = '-';
@@ -4793,9 +4791,10 @@ bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
// Put the number characters in buf2[].
+ char buf2[NUMBUFLEN];
+ int buf2len = 0;
if (pre == 'b' || pre == 'B') {
size_t bits = 0;
- size_t i = 0;
// leading zeros
for (bits = 8 * sizeof(n); bits > 0; bits--) {
@@ -4804,21 +4803,21 @@ bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
}
- while (bits > 0 && i < NUMBUFLEN - 1) {
- buf2[i++] = ((n >> --bits) & 0x1) ? '1' : '0';
+ while (bits > 0 && buf2len < NUMBUFLEN - 1) {
+ buf2[buf2len++] = ((n >> --bits) & 0x1) ? '1' : '0';
}
- buf2[i] = NUL;
+ buf2[buf2len] = NUL;
} else if (pre == 0) {
- vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIu64, (uint64_t)n);
+ buf2len = vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIu64, (uint64_t)n);
} else if (pre == '0') {
- vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIo64, (uint64_t)n);
+ buf2len = vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIo64, (uint64_t)n);
} else if (hexupper) {
- vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIX64, (uint64_t)n);
+ buf2len = vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIX64, (uint64_t)n);
} else {
- vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIx64, (uint64_t)n);
+ buf2len = vim_snprintf(buf2, ARRAY_SIZE(buf2), "%" PRIx64, (uint64_t)n);
}
- length -= (int)strlen(buf2);
+ length -= buf2len;
// Adjust number of zeros to the new number of digits, so the
// total length of the number remains the same.
@@ -4830,8 +4829,14 @@ bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
}
*ptr = NUL;
- strcat(buf1, buf2);
- ins_str(buf1); // insert the new number
+ int buf1len = (int)(ptr - buf1);
+
+ STRCPY(buf1 + buf1len, buf2);
+ buf1len += buf2len;
+
+ ins_str(buf1, (size_t)buf1len); // insert the new number
+ xfree(buf1);
+
endpos = curwin->w_cursor;
if (curwin->w_cursor.col) {
curwin->w_cursor.col--;
@@ -4848,7 +4853,6 @@ bool do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1)
}
theend:
- xfree(buf1);
if (visual) {
curwin->w_cursor = save_cursor;
} else if (did_change) {
diff --git a/src/nvim/textformat.c b/src/nvim/textformat.c
index ca2829fecb..ffa273c0ad 100644
--- a/src/nvim/textformat.c
+++ b/src/nvim/textformat.c
@@ -413,7 +413,7 @@ void internal_format(int textwidth, int second_indent, int flags, bool format_on
// add the additional whitespace needed after the
// comment leader for the numbered list.
for (int i = 0; i < padding; i++) {
- ins_str(" ");
+ ins_str(S_LEN(" "));
}
} else {
set_indent(second_indent, SIN_CHANGED);