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
master
David Lawrence Ramsey 2005-03-14 06:14:02 +00:00
parent af40eeaa06
commit 9389ca29cf
2 changed files with 35 additions and 26 deletions

View File

@ -175,11 +175,12 @@ CVS code -
paragraph-searching utility functions when possible instead of paragraph-searching utility functions when possible instead of
duplicating code. Also overhaul the justify code to make it duplicating code. Also overhaul the justify code to make it
leave the right number of spaces at the ends of the lines of a 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 do_para_begin_void() and do_para_end_void(); changes to
justify_format(), do_para_begin(), inpar(), do_para_end(), justify_format(), do_para_begin(), inpar(), do_para_end(),
do_para_search() (renamed find_paragraph()), and do_justify(); break_line(), do_para_search() (renamed find_paragraph()), and
removal of breakable(). (DLR) do_justify(); removal of breakable(). (DLR)
- Still more steps toward full wide/multibyte character support. - Still more steps toward full wide/multibyte character support.
Make whitespace display mode work with multibyte characters, Make whitespace display mode work with multibyte characters,
and add a few related documentation updates. New function and add a few related documentation updates. New function

View File

@ -2759,15 +2759,15 @@ filestruct *backup_lines(filestruct *first_line, size_t par_len, size_t
return first_line; 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 * 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, * such blank, and force is TRUE, then we find the first blank. Anyway,
* we then take the last space in that group of spaces. The terminating * we then take the last blank in that group of blanks. The terminating
* '\0' counts as a space. */ * '\0' counts as a blank. */
ssize_t break_line(const char *line, ssize_t goal, bool force) ssize_t break_line(const char *line, ssize_t goal, bool force)
{ {
ssize_t space_loc = -1; ssize_t blank_loc = -1;
/* Current tentative return value. Index of the last space we /* Current tentative return value. Index of the last blank we
* found with short enough display width. */ * found with short enough display width. */
ssize_t cur_loc = 0; ssize_t cur_loc = 0;
/* Current index in line. */ /* Current index in line. */
@ -2775,16 +2775,14 @@ ssize_t break_line(const char *line, ssize_t goal, bool force)
assert(line != NULL); assert(line != NULL);
while (*line != '\0' && goal >= 0) { while (*line != '\0' && goal >= 0) {
size_t pos = 0;
int line_len; int line_len;
size_t pos = 0;
if (*line == ' ')
space_loc = cur_loc;
assert(*line != '\t');
line_len = parse_mbchar(line, NULL, NULL, &pos); line_len = parse_mbchar(line, NULL, NULL, &pos);
if (is_blank_mbchar(line))
blank_loc = cur_loc;
goal -= pos; goal -= pos;
line += line_len; line += line_len;
cur_loc += 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. */ /* In fact, the whole line displays shorter than goal. */
return cur_loc; return cur_loc;
if (space_loc == -1) { if (blank_loc == -1) {
/* No space found short enough. */ /* No blank was found that was short enough. */
if (force) { if (force) {
for (; *line != '\0'; line++, cur_loc++) { bool found_blank = FALSE;
if (*line == ' ' && *(line + 1) != ' ' &&
*(line + 1) != '\0') while (*line != '\0') {
return cur_loc; 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; 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. */ * of justify_format(), there can be only two adjacent. */
if (*(line - cur_loc + space_loc + 1) == ' ' || if (*(line - cur_loc + blank_loc + 1) == ' ' ||
*(line - cur_loc + space_loc + 1) == '\0') *(line - cur_loc + blank_loc + 1) == '\0')
space_loc++; blank_loc++;
return space_loc; return blank_loc;
} }
/* Find the beginning of the current paragraph if we're in one, or the /* Find the beginning of the current paragraph if we're in one, or the