nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit d13b6d68962409fd058d1e63fc009b7f1644805a
parent 819066c5d52dbbb4829748b5d44dcdfb1db81d2b
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Thu, 13 Feb 2020 18:47:29 +0100

tweaks: elide an intermediate copy of an added character

In theory this would allow injecting more than one character at a time
into the edit buffer.  But the creation and updating of an undo item for
the addition or the deletion of a character are a bit strange.  For all
other operations and add_undo() is called before the operation, and an
update_undo() afterward.  But for an ADD, the add_undo() is called after
the operation, and for a DEL/BACK, the update_undo() is called before
the operation.  There is some logic to that, but things would be easier
to understand if all operations were handled the same: an add_undo()
beforehand (when needed), and an update_undo() afterward.

Diffstat:
Msrc/text.c | 13++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/text.c b/src/text.c @@ -1290,8 +1290,8 @@ void update_multiline_undo(ssize_t lineno, char *indentation) void update_undo(undo_type action) { undostruct *u = openfile->undotop; - char *char_buf, *textposition; - size_t datalen; + size_t datalen, newlen; + char *textposition; int charlen; if (u->type != action) @@ -1301,11 +1301,10 @@ void update_undo(undo_type action) switch (u->type) { case ADD: - char_buf = charalloc(MAXCHARLEN); - charlen = collect_char(&openfile->current->data[u->mark_begin_x], - char_buf); - u->strdata = addstrings(u->strdata, u->strdata ? strlen(u->strdata) : 0, - char_buf, charlen); + newlen = openfile->current_x - u->begin; + u->strdata = charealloc(u->strdata, newlen + 1); + strncpy(u->strdata, openfile->current->data + u->begin, newlen); + u->strdata[newlen] = '\0'; u->mark_begin_lineno = openfile->current->lineno; u->mark_begin_x = openfile->current_x; break;