From 76e7aaf51462b1fcaa6960c50bafe78a4279b4e5 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sun, 22 Mar 2015 11:20:02 +0000 Subject: [PATCH] Starting to look for a multibyte character not at the start of the string, but only as far back as such a character can possibly be. Speedup suggested by Mark Majeres. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5147 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 5 +++++ src/chars.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) 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;