tmot: fix lbuf_pair() in lines with multi-byte characters - neatvi - [fork] simple vi-type editor with UTF-8 support
 (HTM) git clone git://src.adamsgaard.dk/neatvi
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 0cda11bd3981b5cdf7c73774420019413e9fe032
 (DIR) parent e4391d06a150886b08bc2fa1965957a7bb27f12a
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Wed,  1 Sep 2021 19:02:16 +0430
       
       mot: fix lbuf_pair() in lines with multi-byte characters
       
       Reported and tested by Kyryl Melekhin <k.melekhin@gmail.com>.
       
       Diffstat:
         M mot.c                               |      19 +++++++++----------
       
       1 file changed, 9 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/mot.c b/mot.c
       t@@ -194,21 +194,20 @@ int lbuf_wordend(struct lbuf *lb, int big, int dir, int *row, int *off)
        int lbuf_pair(struct lbuf *lb, int *row, int *off)
        {
                int r = *row, o = *off;
       -        char *ln = lbuf_get(lb, *row);
                char *pairs = "()[]{}";
       -        int p;                        /* index for pairs[] */
       +        int pchr;                /* parenthesis character */
       +        int pidx;                /* index into pairs[] */
                int dep = 1;                /* parenthesis depth */
       -        if (!ln || !ln[o])
       +        while ((pchr = (unsigned char) lbuf_chr(lb, r, o)[0]) && !strchr(pairs, pchr))
       +                o++;
       +        if (!pchr)
                        return 1;
       -        while (!strchr(pairs, ln[o]))
       -                if (!ln[++o])
       -                        return 1;
       -        p = strchr(pairs, ln[o]) - pairs;
       -        while (!lbuf_next(lb, (p & 1) ? -1 : +1, &r, &o)) {
       +        pidx = strchr(pairs, pchr) - pairs;
       +        while (!lbuf_next(lb, (pidx & 1) ? -1 : +1, &r, &o)) {
                        int c = (unsigned char) lbuf_chr(lb, r, o)[0];
       -                if (c == pairs[p ^ 1])
       +                if (c == pairs[pidx ^ 1])
                                dep--;
       -                if (c == pairs[p])
       +                if (c == pairs[pidx])
                                dep++;
                        if (!dep) {
                                *row = r;