From 9389ca29cf9d09f2fa907d6bb7e8a0e5e84216fb Mon Sep 17 00:00:00 2001 From: David Lawrence Ramsey Date: Mon, 14 Mar 2005 06:14:02 +0000 Subject: [PATCH] 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 --- ChangeLog | 7 ++++--- src/nano.c | 54 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index ead13537..d9733405 100644 --- 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 index 0e53c3b1..0ac08b5a 100644 --- 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 -- 2.39.5