diff --git a/ChangeLog b/ChangeLog index 8a74ed9c..21fcd3d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 2016-02-18 Benno Schulenberg * src/search.c (do_replace_loop), src/text.c (do_int_spell_fix), src/winio.c (edit_refresh): Fix Savannah bug #47127 the proper way. + * src/nano.c (free_filestruct): Allow the parameter to be NULL. 2016-02-16 Benno Schulenberg * src/files.c (initialize_buffer_text): Delete redundant assignment. diff --git a/src/cut.c b/src/cut.c index e8d24abc..fffd7bfb 100644 --- a/src/cut.c +++ b/src/cut.c @@ -134,9 +134,8 @@ void do_cut_text( assert(openfile->current != NULL && openfile->current->data != NULL); - /* If keep_cutbuffer is FALSE and the cutbuffer isn't empty, blow - * away the text in the cutbuffer. */ - if (!keep_cutbuffer && cutbuffer != NULL) { + /* Empty the cutbuffer when a chain of cuts is broken. */ + if (!keep_cutbuffer) { free_filestruct(cutbuffer); cutbuffer = NULL; #ifdef DEBUG diff --git a/src/nano.c b/src/nano.c index f9169ed3..84e0e369 100644 --- a/src/nano.c +++ b/src/nano.c @@ -163,10 +163,11 @@ filestruct *copy_filestruct(const filestruct *src) return head; } -/* Free a filestruct. */ +/* Free a whole linked list of filestructs. */ void free_filestruct(filestruct *src) { - assert(src != NULL); + if (src == NULL) + return; while (src->next != NULL) { src = src->next; @@ -364,8 +365,7 @@ void move_to_filestruct(filestruct **file_top, filestruct **file_bot, *file_bot = openfile->filebot; } - openfile->fileage->next = NULL; - free_filestruct(openfile->fileage); + delete_node(openfile->fileage); /* Renumber starting with the line after the original * file_bot. */ diff --git a/src/text.c b/src/text.c index da105ea1..996479b8 100644 --- a/src/text.c +++ b/src/text.c @@ -459,8 +459,7 @@ void redo_cut(undo *u) openfile->mark_set = FALSE; openfile->mark_begin = NULL; - if (cutbuffer != NULL) - free_filestruct(cutbuffer); + free_filestruct(cutbuffer); cutbuffer = oldcutbuffer; cutbottom = oldcutbottom; } @@ -579,8 +578,7 @@ void do_undo(void) openfile->mark_set = TRUE; goto_line_posx(u->lineno, u->begin); cut_marked(); - if (u->cutbuffer != NULL) - free_filestruct(u->cutbuffer); + free_filestruct(u->cutbuffer); u->cutbuffer = cutbuffer; u->cutbottom = cutbottom; cutbuffer = oldcutbuffer; @@ -903,8 +901,7 @@ void discard_until(const undo *thisitem, openfilestruct *thefile) while (dropit != NULL && dropit != thisitem) { thefile->undotop = dropit->next; free(dropit->strdata); - if (dropit->cutbuffer != NULL) - free_filestruct(dropit->cutbuffer); + free_filestruct(dropit->cutbuffer); free(dropit); dropit = thefile->undotop; } @@ -1113,8 +1110,7 @@ fprintf(stderr, " >> Updating... action = %d, openfile->last_action = %d, openf case CUT: if (!cutbuffer) break; - if (u->cutbuffer) - free_filestruct(u->cutbuffer); + free_filestruct(u->cutbuffer); u->cutbuffer = copy_filestruct(cutbuffer); if (u->mark_set) { /* If the "marking" operation was from right-->left or