]> git.wh0rd.org Git - nano.git/commitdiff
add more multibyte character support to break_line()
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 14 Mar 2005 06:14:02 +0000 (06:14 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Mon, 14 Mar 2005 06:14:02 +0000 (06:14 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2364 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c

index ead135379ea2f97daeb001662bf5ae41b7f0dd9f..d97334057bbd0acd8460f79eb05f35f63e40e9b6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -175,11 +175,12 @@ CVS code -
          paragraph-searching utility functions when possible instead of
          duplicating code.  Also overhaul the justify code to make it
          leave the right number of spaces at the ends of the lines of a
-         paragraph, and also to make it simpler.  New functions
+         paragraph, to make it (partially) support multibyte
+         characters, and to make it simpler.  New functions
          do_para_begin_void() and do_para_end_void(); changes to
          justify_format(), do_para_begin(), inpar(), do_para_end(),
-         do_para_search() (renamed find_paragraph()), and do_justify();
-         removal of breakable(). (DLR)
+         break_line(), do_para_search() (renamed find_paragraph()), and
+         do_justify(); removal of breakable(). (DLR)
        - Still more steps toward full wide/multibyte character support.
          Make whitespace display mode work with multibyte characters,
          and add a few related documentation updates.  New function
index 0e53c3b1b29bee7fa3c232e1656e74bae2aa85f1..0ac08b5a9688cbe52eefe34ace9904b1671d8cdc 100644 (file)
@@ -2759,15 +2759,15 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len, size_t
     return first_line;
 }
 
-/* We are trying to break a chunk off line.  We find the last space such
+/* We are trying to break a chunk off line.  We find the last blank such
  * that the display length to there is at most goal + 1.  If there is no
- * such space, and force is TRUE, then we find the first space.  Anyway,
- * we then take the last space in that group of spaces.  The terminating
- * '\0' counts as a space. */
+ * such blank, and force is TRUE, then we find the first blank.  Anyway,
+ * we then take the last blank in that group of blanks.  The terminating
+ * '\0' counts as a blank. */
 ssize_t break_line(const char *line, ssize_t goal, bool force)
 {
-    ssize_t space_loc = -1;
-       /* Current tentative return value.  Index of the last space we
+    ssize_t blank_loc = -1;
+       /* Current tentative return value.  Index of the last blank we
         * found with short enough display width.  */
     ssize_t cur_loc = 0;
        /* Current index in line. */
@@ -2775,16 +2775,14 @@ ssize_t break_line(const char *line, ssize_t goal, bool force)
     assert(line != NULL);
 
     while (*line != '\0' && goal >= 0) {
-       size_t pos = 0;
        int line_len;
-
-       if (*line == ' ')
-           space_loc = cur_loc;
-
-       assert(*line != '\t');
+       size_t pos = 0;
 
        line_len = parse_mbchar(line, NULL, NULL, &pos);
 
+       if (is_blank_mbchar(line))
+           blank_loc = cur_loc;
+
        goal -= pos;
        line += line_len;
        cur_loc += line_len;
@@ -2794,25 +2792,35 @@ ssize_t break_line(const char *line, ssize_t goal, bool force)
        /* In fact, the whole line displays shorter than goal. */
        return cur_loc;
 
-    if (space_loc == -1) {
-       /* No space found short enough. */
+    if (blank_loc == -1) {
+       /* No blank was found that was short enough. */
        if (force) {
-           for (; *line != '\0'; line++, cur_loc++) {
-               if (*line == ' ' && *(line + 1) != ' ' &&
-                       *(line + 1) != '\0')
-                   return cur_loc;
+           bool found_blank = FALSE;
+
+           while (*line != '\0') {
+               int line_len = parse_mbchar(line, NULL, NULL, NULL);
+
+               if (is_blank_mbchar(line)) {
+                   if (!found_blank)
+                       found_blank = TRUE;
+               } else if (found_blank)
+                   return cur_loc - line_len;
+
+               line += line_len;
+               cur_loc += line_len;
            }
+
            return -1;
        }
     }
 
-    /* Perhaps the character after space_loc is a space.  But because
+    /* Perhaps the character after blank_loc is a blank.  But because
      * of justify_format(), there can be only two adjacent. */
-    if (*(line - cur_loc + space_loc + 1) == ' ' ||
-       *(line - cur_loc + space_loc + 1) == '\0')
-       space_loc++;
+    if (*(line - cur_loc + blank_loc + 1) == ' ' ||
+       *(line - cur_loc + blank_loc + 1) == '\0')
+       blank_loc++;
 
-    return space_loc;
+    return blank_loc;
 }
 
 /* Find the beginning of the current paragraph if we're in one, or the