tweak a few functions to remove the assumption that the file always ends

in a magicline, and to rely on fileage and filebot instead of NULL for
their checks to detect the top or bottom of the file


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@3080 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
David Lawrence Ramsey 2005-11-03 21:08:39 +00:00
parent 38ebba11b7
commit 2ffdea4fc1
6 changed files with 57 additions and 51 deletions

View File

@ -37,6 +37,15 @@ CVS code -
source file, and adjust related variables accordingly. New source file, and adjust related variables accordingly. New
file help.c; changes to help_init(), help_line_len(), and file help.c; changes to help_init(), help_line_len(), and
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
always ends in a magicline. Changes to do_cut_till_end(),
do_next_word(), 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(),
do_page_down(), do_para_end(), do_next_word(), do_prev_word(),
do_up(), do_down(), do_scroll_down(), do_right(), do_mouse(),
do_gotolinecolumn(), do_delete(), and find_paragraph(). (DLR)
- nano.h: - nano.h:
- Readd MIN_EDITOR_COLS #define. (DLR) - Readd MIN_EDITOR_COLS #define. (DLR)
- winio.c: - winio.c:

View File

@ -38,12 +38,12 @@ void cutbuffer_reset(void)
keep_cutbuffer = FALSE; keep_cutbuffer = FALSE;
} }
/* If we're not on the magicline, move all the text of the current line, /* If we're not on the last line of the file, move all the text of the
* plus the newline at the end, to the cutbuffer, and set the current * current line, plus the newline at the end, to the cutbuffer, and set
* place we want to where the line used to start. */ * the current place we want to where the line used to start. */
void cut_line(void) void cut_line(void)
{ {
if (openfile->current->next != NULL) { if (openfile->current != openfile->filebot) {
move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, 0, move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, 0,
openfile->current->next, 0); openfile->current->next, 0);
openfile->placewewant = xplustabs(); openfile->placewewant = xplustabs();
@ -68,9 +68,9 @@ void cut_marked(void)
/* If we're not at the end of the current line, move all the text from /* If we're not at the end of the current line, move all the text from
* the current cursor position to the end of the current line, * the current cursor position to the end of the current line,
* not counting the newline at the end, to the cutbuffer. If we are, * not counting the newline at the end, to the cutbuffer. If we are,
* and we're not on the magicline, move the newline at the end to the * and we're not on the last line of the file, move the newline at the
* cutbuffer, and set the current place we want to where the newline * end to the cutbuffer, and set the current place we want to where the
* used to be. */ * newline used to be. */
void cut_to_eol(void) void cut_to_eol(void)
{ {
size_t data_len = strlen(openfile->current->data); size_t data_len = strlen(openfile->current->data);
@ -83,11 +83,11 @@ void cut_to_eol(void)
* the end, to the cutbuffer. */ * the end, to the cutbuffer. */
move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, move_to_filestruct(&cutbuffer, &cutbottom, openfile->current,
openfile->current_x, openfile->current, data_len); openfile->current_x, openfile->current, data_len);
else if (openfile->current->next != NULL) { else if (openfile->current != openfile->filebot) {
/* If we're at the end of the line, and it isn't the magicline, /* If we're at the end of the line, and it isn't the last line
* move all the text from the current position up to the * of the file, move all the text from the current position up
* beginning of the next line, i.e, the newline at the end, to * to the beginning of the next line, i.e, the newline at the
* the cutbuffer. */ * end, to the cutbuffer. */
move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, move_to_filestruct(&cutbuffer, &cutbottom, openfile->current,
openfile->current_x, openfile->current->next, 0); openfile->current_x, openfile->current->next, 0);
openfile->placewewant = xplustabs(); openfile->placewewant = xplustabs();
@ -149,7 +149,8 @@ void do_cut_till_end(void)
check_statusblank(); check_statusblank();
move_to_filestruct(&cutbuffer, &cutbottom, openfile->current, move_to_filestruct(&cutbuffer, &cutbottom, openfile->current,
openfile->current_x, openfile->filebot, 0); openfile->current_x, openfile->filebot,
strlen(openfile->filebot->data));
edit_refresh(); edit_refresh();
set_modified(); set_modified();

View File

@ -86,8 +86,8 @@ void do_page_up(void)
} }
#endif #endif
for (i = editwinrows - 2; i > 0 && openfile->current->prev != NULL; for (i = editwinrows - 2; i > 0 && openfile->current !=
i--) openfile->fileage; i--)
openfile->current = openfile->current->prev; openfile->current = openfile->current->prev;
openfile->current_x = actual_x(openfile->current->data, openfile->current_x = actual_x(openfile->current->data,
@ -127,8 +127,8 @@ void do_page_down(void)
} }
#endif #endif
for (i = editwinrows - 2; i > 0 && openfile->current->next != NULL; for (i = editwinrows - 2; i > 0 && openfile->current !=
i--) openfile->filebot; i--)
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
openfile->current_x = actual_x(openfile->current->data, openfile->current_x = actual_x(openfile->current->data,
@ -151,7 +151,7 @@ void do_para_begin(bool allow_update)
openfile->current_x = 0; openfile->current_x = 0;
openfile->placewewant = 0; openfile->placewewant = 0;
if (openfile->current->prev != NULL) { if (openfile->current != openfile->fileage) {
do { do {
openfile->current = openfile->current->prev; openfile->current = openfile->current->prev;
openfile->current_y--; openfile->current_y--;
@ -181,17 +181,18 @@ void do_para_end(bool allow_update)
openfile->current_x = 0; openfile->current_x = 0;
openfile->placewewant = 0; openfile->placewewant = 0;
while (openfile->current->next != NULL && !inpar(openfile->current)) while (openfile->current != openfile->filebot &&
!inpar(openfile->current))
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
while (openfile->current->next != NULL && while (openfile->current != openfile->filebot &&
inpar(openfile->current->next) && inpar(openfile->current->next) &&
!begpar(openfile->current->next)) { !begpar(openfile->current->next)) {
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
openfile->current_y++; openfile->current_y++;
} }
if (openfile->current->next != NULL) if (openfile->current != openfile->filebot)
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
if (allow_update) if (allow_update)
@ -272,7 +273,7 @@ bool do_next_word(bool allow_punct, bool allow_update)
if (!end_line) if (!end_line)
break; break;
if (openfile->current->next != NULL) { if (openfile->current != openfile->filebot) {
end_line = FALSE; end_line = FALSE;
openfile->current_x = 0; openfile->current_x = 0;
} }
@ -282,8 +283,10 @@ bool do_next_word(bool allow_punct, bool allow_update)
/* If we haven't found it, leave the cursor at the end of the /* If we haven't found it, leave the cursor at the end of the
* file. */ * file. */
if (openfile->current == NULL) if (openfile->current == NULL) {
openfile->current = openfile->filebot; openfile->current = openfile->filebot;
openfile->current_x = strlen(openfile->filebot->data);
}
openfile->placewewant = xplustabs(); openfile->placewewant = xplustabs();
@ -372,7 +375,7 @@ bool do_prev_word(bool allow_punct, bool allow_update)
if (!begin_line) if (!begin_line)
break; break;
if (openfile->current->prev != NULL) { if (openfile->current != openfile->fileage) {
begin_line = FALSE; begin_line = FALSE;
openfile->current_x = strlen(openfile->current->prev->data); openfile->current_x = strlen(openfile->current->prev->data);
} }
@ -483,7 +486,7 @@ void do_up(void)
#endif #endif
/* If we're at the top of the file, get out. */ /* If we're at the top of the file, get out. */
if (openfile->current->prev == NULL) if (openfile->current == openfile->fileage)
return; return;
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno); assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
@ -546,7 +549,7 @@ void do_down(void)
#endif #endif
/* If we're at the bottom of the file, get out. */ /* If we're at the bottom of the file, get out. */
if (openfile->current->next == NULL) if (openfile->current == openfile->filebot)
return; return;
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno); assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
@ -585,7 +588,7 @@ void do_scroll_down(void)
#endif #endif
/* If we're at the bottom of the file, get out. */ /* If we're at the bottom of the file, get out. */
if (openfile->current->next == NULL) if (openfile->current == openfile->filebot)
return; return;
assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno); assert(openfile->current_y == openfile->current->lineno - openfile->edittop->lineno);
@ -631,7 +634,7 @@ void do_right(void)
if (openfile->current->data[openfile->current_x] != '\0') if (openfile->current->data[openfile->current_x] != '\0')
openfile->current_x = move_mbright(openfile->current->data, openfile->current_x = move_mbright(openfile->current->data,
openfile->current_x); openfile->current_x);
else if (openfile->current->next != NULL) { else if (openfile->current != openfile->filebot) {
do_down(); do_down();
openfile->current_x = 0; openfile->current_x = 0;
} }

View File

@ -230,7 +230,7 @@ partition *partition_filestruct(filestruct *top, size_t top_x,
} }
/* Unpartition a filestruct so it begins at (fileage, 0) and ends at /* Unpartition a filestruct so it begins at (fileage, 0) and ends at
* (filebot, strlen(filebot)) again. */ * (filebot, strlen(filebot->data)) again. */
void unpartition_filestruct(partition **p) void unpartition_filestruct(partition **p)
{ {
char *tmp; char *tmp;
@ -1412,10 +1412,12 @@ bool do_mouse(void)
/* Move to where the click occurred. */ /* Move to where the click occurred. */
for (; openfile->current_y < mouse_y && for (; openfile->current_y < mouse_y &&
openfile->current->next != NULL; openfile->current_y++) openfile->current != openfile->filebot;
openfile->current_y++)
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
for (; openfile->current_y > mouse_y && for (; openfile->current_y > mouse_y &&
openfile->current->prev != NULL; openfile->current_y--) openfile->current != openfile->fileage;
openfile->current_y--)
openfile->current = openfile->current->prev; openfile->current = openfile->current->prev;
openfile->current_x = actual_x(openfile->current->data, openfile->current_x = actual_x(openfile->current->data,

View File

@ -994,7 +994,7 @@ void do_gotolinecolumn(ssize_t line, ssize_t column, bool use_answer,
} }
for (openfile->current = openfile->fileage; for (openfile->current = openfile->fileage;
openfile->current->next != NULL && line > 1; line--) openfile->current != openfile->filebot && line > 1; line--)
openfile->current = openfile->current->next; openfile->current = openfile->current->next;
openfile->current_x = actual_x(openfile->current->data, column - 1); openfile->current_x = actual_x(openfile->current->data, column - 1);

View File

@ -97,11 +97,7 @@ void do_delete(void)
openfile->mark_begin_x -= char_buf_len; openfile->mark_begin_x -= char_buf_len;
#endif #endif
openfile->totsize--; openfile->totsize--;
} else if (openfile->current != openfile->filebot && } else if (openfile->current != openfile->filebot) {
(openfile->current->next != openfile->filebot ||
openfile->current->data[0] == '\0')) {
/* We can delete the line before filebot only if it is blank: it
* becomes the new magicline then. */
filestruct *foo = openfile->current->next; filestruct *foo = openfile->current->next;
assert(openfile->current_x == strlen(openfile->current->data)); assert(openfile->current_x == strlen(openfile->current->data));
@ -132,6 +128,12 @@ void do_delete(void)
#ifndef DISABLE_WRAPPING #ifndef DISABLE_WRAPPING
wrap_reset(); wrap_reset();
#endif #endif
/* If we deleted the line before filebot, and the resulting
* line at filebot isn't blank, add a new magicline. */
if (openfile->current == openfile->filebot &&
openfile->current->data[0] != '\0')
new_magicline();
} else } else
return; return;
@ -1065,7 +1067,7 @@ bool find_paragraph(size_t *const quote, size_t *const par)
if (openfile->current == current_save || if (openfile->current == current_save ||
!inpar(openfile->current->prev)) !inpar(openfile->current->prev))
return FALSE; return FALSE;
if (openfile->current->prev != NULL) if (openfile->current != openfile->fileage)
openfile->current = openfile->current->prev; openfile->current = openfile->current->prev;
} }
if (!begpar(openfile->current)) if (!begpar(openfile->current))
@ -2074,21 +2076,15 @@ void do_wordlinechar_count(void)
size_t pww_save = openfile->placewewant; size_t pww_save = openfile->placewewant;
filestruct *current_save = openfile->current; filestruct *current_save = openfile->current;
bool old_mark_set = openfile->mark_set; bool old_mark_set = openfile->mark_set;
bool added_magicline = FALSE;
/* Whether we added a magicline after filebot. */
filestruct *top, *bot; filestruct *top, *bot;
size_t top_x, bot_x; size_t top_x, bot_x;
if (old_mark_set) { if (old_mark_set) {
/* If the mark is on, partition the filestruct so that it /* If the mark is on, partition the filestruct so that it
* contains only the marked text, keep track of whether the text * contains only the marked text, and turn the mark off. */
* will need a magicline added while we're counting words, add
* the magicline if necessary, and turn the mark off. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x, NULL); (const filestruct **)&bot, &bot_x, NULL);
filepart = partition_filestruct(top, top_x, bot, bot_x); filepart = partition_filestruct(top, top_x, bot, bot_x);
if ((added_magicline = (openfile->filebot->data[0] != '\0')))
new_magicline();
openfile->mark_set = FALSE; openfile->mark_set = FALSE;
} }
@ -2102,7 +2098,7 @@ void do_wordlinechar_count(void)
* until we reach the end of the file, incrementing the total word * until we reach the end of the file, incrementing the total word
* count whenever we're on a word just before moving. */ * count whenever we're on a word just before moving. */
while (openfile->current != openfile->filebot || while (openfile->current != openfile->filebot ||
openfile->current_x != 0) { openfile->current->data[openfile->current_x] != '\0') {
if (do_next_word(TRUE, FALSE)) if (do_next_word(TRUE, FALSE))
words++; words++;
} }
@ -2110,11 +2106,6 @@ void do_wordlinechar_count(void)
/* Get the total line and character counts, as "wc -l" and "wc -c" /* Get the total line and character counts, as "wc -l" and "wc -c"
* do, but get the latter in multibyte characters. */ * do, but get the latter in multibyte characters. */
if (old_mark_set) { if (old_mark_set) {
/* If the mark was on and we added a magicline, remove it
* now. */
if (added_magicline)
remove_magicline();
lines = openfile->filebot->lineno - lines = openfile->filebot->lineno -
openfile->fileage->lineno + 1; openfile->fileage->lineno + 1;
chars = get_totsize(openfile->fileage, openfile->filebot); chars = get_totsize(openfile->fileage, openfile->filebot);