diff --git a/ChangeLog b/ChangeLog index a146d10d..6f646e0b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-03-22 Benno Schulenberg + * src/chars.c (move_mbleft): Start looking for a multibyte char + not at the start of the string, but only as far back as such a + char can possibly be. Change suggested by Mark Majeres. + 2015-03-21 Benno Schulenberg * src/text.c (do_alt_speller): Remove some leftovers. * src/search.c: Place some comments better and unwrap some lines. diff --git a/src/chars.c b/src/chars.c index 414c47bd..ccd9f33a 100644 --- a/src/chars.c +++ b/src/chars.c @@ -484,12 +484,18 @@ int parse_mbchar(const char *buf, char *chr, size_t *col) * before the one at pos. */ size_t move_mbleft(const char *buf, size_t pos) { - size_t before = 0, char_len = 0; + size_t before, char_len = 0; assert(buf != NULL && pos <= strlen(buf)); /* There is no library function to move backward one multibyte - * character. Here is the naive, O(pos) way to do it. */ + * character. So we just start groping for one at the farthest + * possible point. */ + if (mb_cur_max() > pos) + before = 0; + else + before = pos - mb_cur_max(); + while (before < pos) { char_len = parse_mbchar(buf + before, NULL, NULL); before += char_len;