commit 9389ca29cf9d09f2fa907d6bb7e8a0e5e84216fb
parent af40eeaa06da5716b0bbd3817d33e56f7fa7561c
Author: David Lawrence Ramsey <pooka109@gmail.com>
Date: Mon, 14 Mar 2005 06:14:02 +0000
add more multibyte character support to break_line()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2364 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
2 files changed, 35 insertions(+), 26 deletions(-)
diff --git 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
diff --git a/src/nano.c b/src/nano.c
@@ -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