trset: bracket expressions may contain [ in re_groupcount() - 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 1f5e321f1f46b3e29f0b99015c2dd76a4b790e9b
 (DIR) parent 4e18f428ca3d31fbba8f0cd92ac71dda85a73422
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Wed, 15 Sep 2021 02:07:17 +0430
       
       rset: bracket expressions may contain [ in re_groupcount()
       
       Reported by Kyryl Melekhin <k.melekhin@gmail.com>.
       
       Diffstat:
         M rset.c                              |      33 ++++++++++++++++++++-----------
       
       1 file changed, 21 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/rset.c b/rset.c
       t@@ -15,23 +15,32 @@ struct rset {
        
        static int re_groupcount(char *s)
        {
       -        int n = 0;
       +        int n = 0;        /* number of groups */
       +        int brk = 0;        /* one if inside a bracket expression */
       +        int brk2 = 0;        /* nested bracket type: ':', '*', or '=' */
                while (*s) {
       -                if (s[0] == '(')
       -                        n++;
       -                if (s[0] == '[') {
       -                        int dep = 0;
       -                        s += s[1] == '^' ? 3 : 2;
       -                        while (s[0] && (s[0] != ']' || dep)) {
       -                                if (s[0] == '[')
       -                                        dep++;
       +                if (!brk) {
       +                        if (s[0] == '(')
       +                                n++;
       +                        if (s[0] == '\\' && s[1]) {
       +                                s++;
       +                        } else if (s[0] == '[' && s[1] && s[2]) {
       +                                s += s[1] == '^' ? 2 : 1;
       +                                brk = 1;
       +                        }
       +                } else {
       +                        if (!brk2) {
                                        if (s[0] == ']')
       -                                        dep--;
       +                                        brk = 0;
       +                                if (s[0] == '[' && (s[1] == ':' || s[1] == '*' || s[1] == '=')) {
       +                                        brk2 = s[1];
       +                                        s++;
       +                                }
       +                        } else if (s[0] == brk2 && s[1] == ']') {
       +                                brk2 = 0;
                                        s++;
                                }
                        }
       -                if (s[0] == '\\' && s[1])
       -                        s++;
                        s++;
                }
                return n;