tweak open_buffer() and read_file() to remove the assumption that the

file always ends in a magicline


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3090 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
master
David Lawrence Ramsey 2005-11-05 17:20:39 +00:00
parent 6619c43b88
commit c3b3b9a28f
2 changed files with 71 additions and 8 deletions

View File

@ -39,7 +39,8 @@ CVS code -
do_help() (all moved to help.c). (DLR)
- Tweak a few functions to remove the assumption that the file
always ends in a magicline. Changes to do_cut_till_end(),
write_file(), and do_wordlinechar_count(). (DLR)
open_buffer(), read_file(), write_file(), and
do_wordlinechar_count(). (DLR)
- Tweak a few functions to rely on fileage and filebot instead
of NULL for their checks to detect the top or bottom of the
file. Changes to cut_line(), cut_to_eol(), do_page_up(),

View File

@ -153,9 +153,12 @@ void open_buffer(const char *filename)
}
/* If we have a file and we're loading into a new buffer, move back
* to the first line of the buffer. */
if (rc != -1 && new_buffer)
* to the beginning of the first line of the buffer. */
if (rc != -1 && new_buffer) {
openfile->current = openfile->fileage;
openfile->current_x = 0;
openfile->placewewant = 0;
}
#ifdef ENABLE_COLOR
/* If we're loading into a new buffer, update the colors to account
@ -448,18 +451,77 @@ void read_file(FILE *f, const char *filename)
if (fileptr == NULL)
open_buffer("");
/* Did we try to insert a file of zero bytes? */
/* Attach the file we got to the filestruct. If we got a file of
* zero bytes, don't do anything. */
if (num_lines > 0) {
fileptr->next = openfile->current;
openfile->current->prev = fileptr;
/* If the file we got doesn't end in a newline, tack its last
* line onto the beginning of the line at current. */
if (len > 0) {
size_t current_len = strlen(openfile->current->data);
/* Adjust the current x-coordinate to compensate for the
* change in the current line. */
if (num_lines == 1)
openfile->current_x += len;
else
openfile->current_x = len;
/* Prepend the text at fileptr to the text at current. */
openfile->current->data =
charealloc(openfile->current->data, len +
current_len + 1);
charmove(openfile->current->data + len,
openfile->current->data, current_len + 1);
strncpy(openfile->current->data, fileptr->data, len);
/* Don't destroy fileage, edittop, or filebot! */
if (fileptr == openfile->fileage)
openfile->fileage = openfile->current;
if (fileptr == openfile->edittop)
openfile->edittop = openfile->current;
if (fileptr == openfile->filebot)
openfile->filebot = openfile->current;
/* Move fileptr back one line and delete the old fileptr,
* since its text has been saved. */
fileptr = fileptr->prev;
if (fileptr != NULL) {
if (fileptr->next != NULL)
free(fileptr->next);
}
}
/* Attach the line at current after the line at fileptr. */
if (fileptr != NULL) {
fileptr->next = openfile->current;
openfile->current->prev = fileptr;
}
/* Renumber starting with the last line of the file we
* inserted. */
renumber(openfile->current);
} else
/* Adjust the current x-coordinate to compensate for the
* change in the current line. */
openfile->current_x = 0;
openfile->placewewant = 0;
}
openfile->totsize += get_totsize(openfile->fileage,
openfile->filebot);
/* If text has been added to the magicline (i.e, a file that doesn't
* end in a newline has been inserted at the end of the current
* buffer), add a new magicline, and move the current line down to
* it. */
if (openfile->filebot->data[0] != '\0') {
new_magicline();
openfile->current = openfile->filebot;
openfile->current_x = 0;
}
/* Set the current place we want to the end of the last line of the
* file we inserted. */
openfile->placewewant = xplustabs();
#ifndef NANO_SMALL
if (format == 3)
statusbar(