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) do_help() (all moved to help.c). (DLR)
- Tweak a few functions to remove the assumption that the file - Tweak a few functions to remove the assumption that the file
always ends in a magicline. Changes to do_cut_till_end(), 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 - Tweak a few functions to rely on fileage and filebot instead
of NULL for their checks to detect the top or bottom of the of NULL for their checks to detect the top or bottom of the
file. Changes to cut_line(), cut_to_eol(), do_page_up(), 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 /* If we have a file and we're loading into a new buffer, move back
* to the first line of the buffer. */ * to the beginning of the first line of the buffer. */
if (rc != -1 && new_buffer) if (rc != -1 && new_buffer) {
openfile->current = openfile->fileage; openfile->current = openfile->fileage;
openfile->current_x = 0;
openfile->placewewant = 0;
}
#ifdef ENABLE_COLOR #ifdef ENABLE_COLOR
/* If we're loading into a new buffer, update the colors to account /* 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) if (fileptr == NULL)
open_buffer(""); 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) { if (num_lines > 0) {
fileptr->next = openfile->current; /* If the file we got doesn't end in a newline, tack its last
openfile->current->prev = fileptr; * 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); renumber(openfile->current);
} else
/* Adjust the current x-coordinate to compensate for the
* change in the current line. */
openfile->current_x = 0; openfile->current_x = 0;
openfile->placewewant = 0;
}
openfile->totsize += get_totsize(openfile->fileage, openfile->totsize += get_totsize(openfile->fileage,
openfile->filebot); 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 #ifndef NANO_SMALL
if (format == 3) if (format == 3)
statusbar( statusbar(