From 66e21416afe77049bbd6956f27f9872a84ae8bca Mon Sep 17 00:00:00 2001
From: Benno Schulenberg <bensberg@justemail.net>
Date: Mon, 30 Nov 2015 16:21:51 +0000
Subject: [PATCH] Storing and retrieving the correct file size before and after
 an action. This fixes Savannah bug #45523.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5456 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog  | 3 +++
 src/nano.h | 4 ++++
 src/text.c | 6 ++++++
 3 files changed, 13 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 9ba5f935..6f6628c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
 	and NONEWLINES is set, there is no next line at which to put the
 	cutting point for a redo.  So put it at the very end of the cut.
 	This fixes Savannah bug #46541.
+	* src/text.c (add_undo, update_undo, do_undo, do_redo), src/nano.h:
+	Store and retrieve the correct file size before and after an action.
+	This fixes Savannah bug #45523.
 
 2015-11-29  Benno Schulenberg  <bensberg@justemail.net>
 	* src/color.c (reset_multis): Evaluate correctly whether to reset
diff --git a/src/nano.h b/src/nano.h
index b2604a17..e9293e18 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -329,6 +329,10 @@ typedef struct undo {
 	/* Where did this action begin or end. */
     char *strdata;
 	/* String type data we will use for copying the affected line back. */
+    size_t wassize;
+	/* The file size before the action. */
+    size_t newsize;
+	/* The file size after the action. */
     int xflags;
 	/* Some flag data we need. */
 
diff --git a/src/text.c b/src/text.c
index ff9872b7..2a2a5161 100644
--- a/src/text.c
+++ b/src/text.c
@@ -611,6 +611,7 @@ void do_undo(void)
     openfile->current_undo = openfile->current_undo->next;
     openfile->last_action = OTHER;
     openfile->placewewant = xplustabs();
+    openfile->totsize = u->wassize;
     set_modified();
 }
 
@@ -748,6 +749,7 @@ void do_redo(void)
     openfile->current_undo = u;
     openfile->last_action = OTHER;
     openfile->placewewant = xplustabs();
+    openfile->totsize = u->newsize;
     set_modified();
 }
 #endif /* !NANO_TINY */
@@ -957,12 +959,14 @@ void add_undo(undo_type action)
     u->mark_begin_lineno = openfile->current->lineno;
     u->mark_begin_x = openfile->current_x;
     u->mark_set = FALSE;
+    u->wassize = openfile->totsize;
     u->xflags = 0;
 
     switch (u->type) {
     /* We need to start copying data into the undo buffer
      * or we won't be able to restore it later. */
     case ADD:
+	u->wassize--;
 	break;
     case BACK:
 	/* If the next line is the magic line, don't ever undo this
@@ -1065,6 +1069,8 @@ fprintf(stderr, "  >> Updating... action = %d, openfile->last_action = %d, openf
     assert(openfile->undotop != NULL);
     u = openfile->undotop;
 
+    u->newsize = openfile->totsize;
+
     switch (u->type) {
     case ADD: {
 #ifdef DEBUG
-- 
GitLab