add more multibyte character support to break_line()
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2364 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
af40eeaa06
commit
9389ca29cf
|
@ -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
|
||||||
|
|
54
src/nano.c
54
src/nano.c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue