]> git.wh0rd.org Git - nano.git/commitdiff
when doing marked spell-check, properly handle the case where the mark
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Fri, 5 Nov 2004 23:03:03 +0000 (23:03 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Fri, 5 Nov 2004 23:03:03 +0000 (23:03 +0000)
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

ChangeLog
src/cut.c
src/files.c
src/nano.c
src/proto.h
src/search.c
src/utils.c
src/winio.c

index 66145fea571019c1d4b2f1ac272c7e9e9b22d8e5..27cfe00d245c870db08cac04727427c6ad22d1fd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -279,6 +279,10 @@ CVS code -
          (DLR)
   mallocstrcpy()
        - 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:
   unget_kbinput()
        - New function used as a wrapper for ungetch(). (DLR)
index b2b372eca3a4cdd294cf8882b40d29121cd368af..9c88c3b8c299b4579b9079538ed89672651a049d 100644 (file)
--- a/src/cut.c
+++ b/src/cut.c
@@ -105,7 +105,7 @@ void cut_marked_segment(void)
     /* Set up the top and bottom lines and coordinates of the marked
      * text. */
     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
      * line into tmp, and set newsize to that partial line's length. */
index bcef6f13cff0dc22824687aad80b8c686eb85e3a..1dc658e00091451d17c029a1ce843b3148c19b3c 100644 (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
      * text. */
     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);
 
     /* If the line at filebot is blank, treat it as the magicline and
index 1bd0094a055d1732d7a4b1587554f84d7c050c21..9db6a0a19ec75ed39b38fcdd1bdaa7d61db62110 100644 (file)
@@ -1537,8 +1537,11 @@ bool do_int_spell_fix(const char *word)
 #endif
 #ifndef NANO_SMALL
     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;
-    size_t top_x, bot_x;
+    size_t top_x, bot_x, bot_data_len;
 #endif
 
     /* 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
         * contains only the marked text, and turn the mark off. */
        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);
        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. */
     free(last_search);
     last_search = save_search;
@@ -1843,9 +1856,9 @@ const char *do_int_speller(const char *tempfile_name)
  * otherwise the error string. */
 const char *do_alt_speller(char *tempfile_name)
 {
-    int alt_spell_status, lineno_cur = current->lineno;
-    size_t x_cur = current_x, pww_cur = placewewant;
-    int y_cur = current_y;
+    int alt_spell_status, lineno_save = current->lineno;
+    size_t current_x_save = current_x, pww_save = placewewant;
+    int current_y_save = current_y;
     pid_t pid_spell;
     char *ptr;
     static int arglen = 3;
@@ -1855,7 +1868,10 @@ const char *do_alt_speller(char *tempfile_name)
     bool old_mark_set = ISSET(MARK_ISSET);
     bool added_magicline = FALSE;
        /* 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
         * the alternate spell command.  The line that mark_beginbuf
         * 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 the mark is on, save the number of the line it starts on,
         * and then turn the mark off. */
-       mbb_lineno_cur = mark_beginbuf->lineno;
+       mbb_lineno_save = mark_beginbuf->lineno;
        UNSET(MARK_ISSET);
     }
 #endif
@@ -1934,7 +1950,7 @@ const char *do_alt_speller(char *tempfile_name)
         * temp file (which should contain the spell-checked marked
         * text) will have a magicline added when it's reloaded. */
        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);
        added_magicline = (filebot->data[0] != '\0');
 
@@ -1961,11 +1977,22 @@ const char *do_alt_speller(char *tempfile_name)
 #ifndef NANO_SMALL
     if (old_mark_set) {
        filestruct *top_save = fileage;
+       size_t bot_data_len;
 
        /* If we added a magicline, remove it now. */
        if (added_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
         * contains all the text again.  Note that we've replaced 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
         * 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;
 
        /* 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
      * 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();
     clearok(topwin, FALSE);
     titlebar(NULL);
index c3b5fca92aec419bbadf1f7169849cc11cfee123..6f49328afa0fec7d125fc18522a6121b689538ea 100644 (file)
@@ -504,7 +504,7 @@ void remove_magicline(void);
 void get_totals(const filestruct *begin, const filestruct *end, int
        *lines, long *size);
 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
 #ifndef DISABLE_TABCOMP
 int check_wildcard_match(const char *text, const char *pattern);
index 2c4ddd67612e467f630c8a64f2f8f9d166cced35..8cfa0de88fa5fc929d3610005b9ce3957008ef8a 100644 (file)
@@ -686,12 +686,10 @@ ssize_t do_replace_loop(const char *needle, const filestruct
 
     if (old_mark_set) {
        /* If the mark is on, partition the filestruct so that it
-        * contains only the marked text, set right_side_up properly,
-        * set edittop to the top of the partition, turn the mark off,
-        * and refresh the screen. */
+        * contains only the marked text, set edittop to the top of the
+        * partition, turn the mark off, and refresh the screen. */
        mark_order((const filestruct **)&top, &top_x,
-           (const filestruct **)&bot, &bot_x);
-       right_side_up = (bot == current && bot_x == current_x);
+           (const filestruct **)&bot, &bot_x, &right_side_up);
        filepart = partition_filestruct(top, top_x, bot, bot_x);
        edittop = fileage;
        UNSET(MARK_ISSET);
index 5606c3f7aaa8a759284cc4d371b747eaa189d54d..71de9b1d5c5458c578fc916fa4b5e5a43e17f833 100644 (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,
- * 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
-       **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);
 
@@ -505,11 +508,15 @@ void mark_order(const filestruct **top, size_t *top_x, const filestruct
        *top_x = mark_beginx;
        *bot = current;
        *bot_x = current_x;
+       if (right_side_up != NULL)
+           *right_side_up = TRUE;
     } else {
        *bot = mark_beginbuf;
        *bot_x = mark_beginx;
        *top = current;
        *top_x = current_x;
+       if (right_side_up != NULL)
+           *right_side_up = FALSE;
     }
 }
 #endif
index 5aae8234c5d44436cec4d929cc0266204da7af39..846bd44430fb808882f5fb213fa453920c289e7c 100644 (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
             * 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)
            top_x = startpos;