when doing marked spell-check, properly handle the case where the mark

ends in the middle of a word and that word is spell-checked; also move
the logic to detect an upside-down mark to mark_order() instead of using
the same logic in three different places, and rename a few variables for
consistency


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2070 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
This commit is contained in:
David Lawrence Ramsey 2004-11-05 23:03:03 +00:00
parent 93eb293fbb
commit 90e59c1a18
8 changed files with 57 additions and 21 deletions

View File

@ -279,6 +279,10 @@ CVS code -
(DLR) (DLR)
mallocstrcpy() mallocstrcpy()
- Refactor to be a wrapper for mallocstrncpy(). (DLR) - Refactor to be a wrapper for mallocstrncpy(). (DLR)
mark_order()
- Add new parameter right_side_up. Set it to TRUE If the mark
begins with (mark_beginbuf, mark_beginx) and ends with
(current, current_x), or FALSE otherwise. (DLR)
- winio.c: - winio.c:
unget_kbinput() unget_kbinput()
- New function used as a wrapper for ungetch(). (DLR) - New function used as a wrapper for ungetch(). (DLR)

View File

@ -105,7 +105,7 @@ void cut_marked_segment(void)
/* Set up the top and bottom lines and coordinates of the marked /* Set up the top and bottom lines and coordinates of the marked
* text. */ * text. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x); (const filestruct **)&bot, &bot_x, NULL);
/* Make the first cut line manually. Move the cut part of the top /* Make the first cut line manually. Move the cut part of the top
* line into tmp, and set newsize to that partial line's length. */ * line into tmp, and set newsize to that partial line's length. */

View File

@ -1760,7 +1760,7 @@ int write_marked(const char *name, int tmp, int append)
/* Partition the filestruct so that it contains only the marked /* Partition the filestruct so that it contains only the marked
* text. */ * text. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x); (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 the line at filebot is blank, treat it as the magicline and /* If the line at filebot is blank, treat it as the magicline and

View File

@ -1537,8 +1537,11 @@ bool do_int_spell_fix(const char *word)
#endif #endif
#ifndef NANO_SMALL #ifndef NANO_SMALL
bool old_mark_set = ISSET(MARK_ISSET); bool old_mark_set = ISSET(MARK_ISSET);
bool right_side_up = FALSE;
/* TRUE if (mark_beginbuf, mark_beginx) is the top of the mark,
* FALSE if (current, current_x) is. */
filestruct *top, *bot; filestruct *top, *bot;
size_t top_x, bot_x; size_t top_x, bot_x, bot_data_len;
#endif #endif
/* Make sure spell-check is case sensitive. */ /* Make sure spell-check is case sensitive. */
@ -1567,7 +1570,7 @@ bool do_int_spell_fix(const char *word)
/* 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, and turn the mark off. */ * contains only the marked text, and turn the mark off. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x); (const filestruct **)&bot, &bot_x, &right_side_up);
filepart = partition_filestruct(top, top_x, bot, bot_x); filepart = partition_filestruct(top, top_x, bot, bot_x);
UNSET(MARK_ISSET); UNSET(MARK_ISSET);
} }
@ -1614,6 +1617,16 @@ bool do_int_spell_fix(const char *word)
} }
} }
/* If the mark ended in the middle of a word and that word was
* spell-checked, put either current_x_save or mark_beginx,
* depending on the value of right_side_up, at the end of the
* spell-checked word. */
bot_data_len = strlen(filebot->data);
if (right_side_up)
current_x_save = bot_data_len;
else
mark_beginx = bot_data_len;
/* Restore the search/replace strings. */ /* Restore the search/replace strings. */
free(last_search); free(last_search);
last_search = save_search; last_search = save_search;
@ -1843,9 +1856,9 @@ const char *do_int_speller(const char *tempfile_name)
* otherwise the error string. */ * otherwise the error string. */
const char *do_alt_speller(char *tempfile_name) const char *do_alt_speller(char *tempfile_name)
{ {
int alt_spell_status, lineno_cur = current->lineno; int alt_spell_status, lineno_save = current->lineno;
size_t x_cur = current_x, pww_cur = placewewant; size_t current_x_save = current_x, pww_save = placewewant;
int y_cur = current_y; int current_y_save = current_y;
pid_t pid_spell; pid_t pid_spell;
char *ptr; char *ptr;
static int arglen = 3; static int arglen = 3;
@ -1855,7 +1868,10 @@ const char *do_alt_speller(char *tempfile_name)
bool old_mark_set = ISSET(MARK_ISSET); bool old_mark_set = ISSET(MARK_ISSET);
bool added_magicline = FALSE; bool added_magicline = FALSE;
/* Whether we added a magicline after filebot. */ /* Whether we added a magicline after filebot. */
int mbb_lineno_cur = 0; bool right_side_up = FALSE;
/* TRUE if (mark_beginbuf, mark_beginx) is the top of the mark,
* FALSE if (current, current_x) is. */
int mbb_lineno_save = 0;
/* We're going to close the current file, and open the output of /* We're going to close the current file, and open the output of
* the alternate spell command. The line that mark_beginbuf * the alternate spell command. The line that mark_beginbuf
* points to will be freed, so we save the line number and * points to will be freed, so we save the line number and
@ -1870,7 +1886,7 @@ const char *do_alt_speller(char *tempfile_name)
if (old_mark_set) { if (old_mark_set) {
/* If the mark is on, save the number of the line it starts on, /* If the mark is on, save the number of the line it starts on,
* and then turn the mark off. */ * and then turn the mark off. */
mbb_lineno_cur = mark_beginbuf->lineno; mbb_lineno_save = mark_beginbuf->lineno;
UNSET(MARK_ISSET); UNSET(MARK_ISSET);
} }
#endif #endif
@ -1934,7 +1950,7 @@ const char *do_alt_speller(char *tempfile_name)
* temp file (which should contain the spell-checked marked * temp file (which should contain the spell-checked marked
* text) will have a magicline added when it's reloaded. */ * text) will have a magicline added when it's reloaded. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x); (const filestruct **)&bot, &bot_x, &right_side_up);
filepart = partition_filestruct(top, top_x, bot, bot_x); filepart = partition_filestruct(top, top_x, bot, bot_x);
added_magicline = (filebot->data[0] != '\0'); added_magicline = (filebot->data[0] != '\0');
@ -1961,11 +1977,22 @@ const char *do_alt_speller(char *tempfile_name)
#ifndef NANO_SMALL #ifndef NANO_SMALL
if (old_mark_set) { if (old_mark_set) {
filestruct *top_save = fileage; filestruct *top_save = fileage;
size_t bot_data_len;
/* If we added a magicline, remove it now. */ /* If we added a magicline, remove it now. */
if (added_magicline) if (added_magicline)
remove_magicline(); remove_magicline();
/* If the mark ended in the middle of a word and that word was
* spell-checked, put either current_x_save or mark_beginx,
* depending on the value of right_side_up, at the end of the
* spell-checked word. */
bot_data_len = strlen(filebot->data);
if (right_side_up)
current_x_save = bot_data_len;
else
mark_beginx = bot_data_len;
/* If the mark was on, unpartition the filestruct so that it /* If the mark was on, unpartition the filestruct so that it
* contains all the text again. Note that we've replaced the * contains all the text again. Note that we've replaced the
* marked text originally in the partition with the * marked text originally in the partition with the
@ -1985,7 +2012,7 @@ const char *do_alt_speller(char *tempfile_name)
/* Assign mark_beginbuf to the line where the mark began /* Assign mark_beginbuf to the line where the mark began
* before. */ * before. */
do_gotopos(mbb_lineno_cur, mark_beginx, y_cur, 0); do_gotopos(mbb_lineno_save, mark_beginx, current_y_save, 0);
mark_beginbuf = current; mark_beginbuf = current;
/* Assign mark_beginx to the location in mark_beginbuf where the /* Assign mark_beginx to the location in mark_beginbuf where the
@ -2000,7 +2027,7 @@ const char *do_alt_speller(char *tempfile_name)
/* Go back to the old position, mark the file as modified, and make /* Go back to the old position, mark the file as modified, and make
* sure that the titlebar is refreshed. */ * sure that the titlebar is refreshed. */
do_gotopos(lineno_cur, x_cur, y_cur, pww_cur); do_gotopos(lineno_save, current_x_save, current_y_save, pww_save);
set_modified(); set_modified();
clearok(topwin, FALSE); clearok(topwin, FALSE);
titlebar(NULL); titlebar(NULL);

View File

@ -504,7 +504,7 @@ void remove_magicline(void);
void get_totals(const filestruct *begin, const filestruct *end, int void get_totals(const filestruct *begin, const filestruct *end, int
*lines, long *size); *lines, long *size);
void mark_order(const filestruct **top, size_t *top_x, const filestruct void mark_order(const filestruct **top, size_t *top_x, const filestruct
**bot, size_t *bot_x); **bot, size_t *bot_x, bool *right_side_up);
#endif #endif
#ifndef DISABLE_TABCOMP #ifndef DISABLE_TABCOMP
int check_wildcard_match(const char *text, const char *pattern); int check_wildcard_match(const char *text, const char *pattern);

View File

@ -686,12 +686,10 @@ ssize_t do_replace_loop(const char *needle, const filestruct
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, set right_side_up properly, * contains only the marked text, set edittop to the top of the
* set edittop to the top of the partition, turn the mark off, * partition, turn the mark off, and refresh the screen. */
* and refresh the screen. */
mark_order((const filestruct **)&top, &top_x, mark_order((const filestruct **)&top, &top_x,
(const filestruct **)&bot, &bot_x); (const filestruct **)&bot, &bot_x, &right_side_up);
right_side_up = (bot == current && bot_x == current_x);
filepart = partition_filestruct(top, top_x, bot, bot_x); filepart = partition_filestruct(top, top_x, bot, bot_x);
edittop = fileage; edittop = fileage;
UNSET(MARK_ISSET); UNSET(MARK_ISSET);

View File

@ -493,9 +493,12 @@ void get_totals(const filestruct *begin, const filestruct *end, int
} }
/* Set top_x and bot_x to the top and bottom x-coordinates of the mark, /* Set top_x and bot_x to the top and bottom x-coordinates of the mark,
* respectively, based on the locations of top and bot. */ * respectively, based on the locations of top and bot. If
* right_side_up isn't NULL, set it to TRUE If the mark begins with
* (mark_beginbuf, mark_beginx) and ends with (current, current_x), or
* FALSE otherwise. */
void mark_order(const filestruct **top, size_t *top_x, const filestruct void mark_order(const filestruct **top, size_t *top_x, const filestruct
**bot, size_t *bot_x) **bot, size_t *bot_x, bool *right_side_up)
{ {
assert(top != NULL && top_x != NULL && bot != NULL && bot_x != NULL); assert(top != NULL && top_x != NULL && bot != NULL && bot_x != NULL);
@ -505,11 +508,15 @@ void mark_order(const filestruct **top, size_t *top_x, const filestruct
*top_x = mark_beginx; *top_x = mark_beginx;
*bot = current; *bot = current;
*bot_x = current_x; *bot_x = current_x;
if (right_side_up != NULL)
*right_side_up = TRUE;
} else { } else {
*bot = mark_beginbuf; *bot = mark_beginbuf;
*bot_x = mark_beginx; *bot_x = mark_beginx;
*top = current; *top = current;
*top_x = current_x; *top_x = current_x;
if (right_side_up != NULL)
*right_side_up = FALSE;
} }
} }
#endif #endif

View File

@ -2862,7 +2862,7 @@ void edit_add(const filestruct *fileptr, const char *converted, int
/* Number of chars to paint on this line. There are COLS /* Number of chars to paint on this line. There are COLS
* characters on a whole line. */ * characters on a whole line. */
mark_order(&top, &top_x, &bot, &bot_x); mark_order(&top, &top_x, &bot, &bot_x, NULL);
if (top->lineno < fileptr->lineno || top_x < startpos) if (top->lineno < fileptr->lineno || top_x < startpos)
top_x = startpos; top_x = startpos;