From ea577874ef220b85737ca0b84803750c5114e5c7 Mon Sep 17 00:00:00 2001
From: Chris Allegretta <chrisa@asty.org>
Date: Sun, 3 Aug 2008 20:19:42 +0000
Subject: [PATCH] - Add redo of an insert - Fix bug in fsfromlineno - Tiny
 cleanups in undo

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4292 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 src/text.c  | 17 ++++++++++++-----
 src/utils.c |  4 ++--
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/text.c b/src/text.c
index 0564cb9c..5226a321 100644
--- a/src/text.c
+++ b/src/text.c
@@ -498,6 +498,7 @@ void do_redo(void)
 {
     undo *u = openfile->undotop;
     filestruct *f = openfile->current, *t;
+    filestruct *oldcutbuffer = cutbuffer, *oldcutbottom = cutbottom;
     int len = 0, i;
     char *undidmsg, *data;
 
@@ -619,6 +620,15 @@ void do_redo(void)
 	u->strdata = f->data;
 	f->data = data;
 	break;
+     case INSERT:
+	undidmsg = _("text insert");
+	cutbuffer = u->cutbuffer;
+	cutbottom = u->cutbottom;
+	do_gotolinecolumn(u->lineno, u->begin+1, FALSE, FALSE, FALSE, FALSE);
+	do_uncut_text();
+	cutbuffer = oldcutbuffer;
+	cutbottom = oldcutbottom;
+	break;
     default:
 	undidmsg = _("wtf?");
 	break;
@@ -804,11 +814,8 @@ void add_undo(undo_type current_action)
 	fs->undotop = fs->undotop->next;
 	if (u2->strdata != NULL)
 	    free(u2->strdata);
-	while (u2->cutbuffer != NULL) {
-	    filestruct *f2 = u2->cutbuffer->next;
-	    u2->cutbuffer = u2->cutbuffer->next;
-	    free(f2);
-	}
+	if (u2->cutbuffer);
+	    free_filestruct(u2->cutbuffer);
 	free(u2);
     }
 
diff --git a/src/utils.c b/src/utils.c
index d09118fa..0c10f46b 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -613,10 +613,10 @@ filestruct *fsfromline(ssize_t lineno)
 	   ;
     else
         for (; f->lineno != lineno && f->next != NULL; f = f->next)
+	    ;
 
     if (f->lineno != lineno)
-	return NULL;
-
+	f = NULL;
     return f;
 }
 
-- 
GitLab