trset: rename from reset - 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 3a7a3bacd46ef3477daae02cddff1c18bf0a2658
 (DIR) parent 4b1b940dae17628b3ae84a84ae69d76df471662b
 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
       Date:   Mon, 11 May 2015 22:00:01 +0430
       
       rset: rename from reset
       
       Diffstat:
         M Makefile                            |       2 +-
         M dir.c                               |      24 ++++++++++++------------
         D reset.c                             |     100 -------------------------------
         A rset.c                              |     102 +++++++++++++++++++++++++++++++
         M vi.h                                |       6 +++---
       
       5 files changed, 118 insertions(+), 116 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -2,7 +2,7 @@ CC = cc
        CFLAGS = -Wall -O2
        LDFLAGS =
        
       -OBJS = vi.o ex.o lbuf.o sbuf.o ren.o dir.o reg.o led.o uc.o term.o reset.o
       +OBJS = vi.o ex.o lbuf.o sbuf.o ren.o dir.o reg.o led.o uc.o term.o rset.o
        
        all: vi
        %.o: %.c
 (DIR) diff --git a/dir.c b/dir.c
       t@@ -28,9 +28,9 @@ static struct dmark {
                {-1, +1, 0, "[a-zA-Z0-9_][^" CR2L "\\\\`$']*[a-zA-Z0-9_]"},
        };
        
       -static struct reset *dir_rslr;
       -static struct reset *dir_rsrl;
       -static struct reset *dir_rsctx;
       +static struct rset *dir_rslr;        /* pattern of marks for left-to-right strings */
       +static struct rset *dir_rsrl;        /* pattern of marks for right-to-left strings */
       +static struct rset *dir_rsctx;        /* direction context patterns */
        
        static int uc_off(char *s, int off)
        {
       t@@ -45,11 +45,11 @@ static int dir_match(char **chrs, int beg, int end, int ctx, int *rec,
                        int *r_beg, int *r_end, int *c_beg, int *c_end, int *dir)
        {
                int subs[16 * 2];
       -        struct reset *rs = ctx < 0 ? dir_rsrl : dir_rslr;
       +        struct rset *rs = ctx < 0 ? dir_rsrl : dir_rslr;
                struct sbuf *str = sbuf_make();
                int found;
                sbuf_mem(str, chrs[beg], chrs[end] - chrs[beg]);
       -        found = reset_find(rs, sbuf_buf(str), LEN(subs) / 2, subs, 0);
       +        found = rset_find(rs, sbuf_buf(str), LEN(subs) / 2, subs, 0);
                if (found >= 0 && r_beg && r_end && c_beg && c_end) {
                        struct dmark *dm = &dmarks[found];
                        char *s = sbuf_buf(str);
       t@@ -103,7 +103,7 @@ int dir_context(char *s)
                        return +1;
                if (xdir == 'R')
                        return -1;
       -        found = reset_find(dir_rsctx, s ? s : "", 0, NULL, 0);
       +        found = rset_find(dir_rsctx, s ? s : "", 0, NULL, 0);
                if (found >= 0)
                        return dcontexts[found].dir;
                return xdir == 'r' ? +1 : -1;
       t@@ -133,16 +133,16 @@ void dir_init(void)
                        relr[i] = dmarks[i].ctx >= 0 ? dmarks[i].pat : NULL;
                        rerl[i] = dmarks[i].ctx <= 0 ? dmarks[i].pat : NULL;
                }
       -        dir_rslr = reset_make(LEN(dmarks), relr);
       -        dir_rsrl = reset_make(LEN(dmarks), rerl);
       +        dir_rslr = rset_make(LEN(dmarks), relr);
       +        dir_rsrl = rset_make(LEN(dmarks), rerl);
                for (i = 0; i < LEN(dcontexts); i++)
                        ctx[i] = dcontexts[i].pat;
       -        dir_rsctx = reset_make(LEN(dcontexts), ctx);
       +        dir_rsctx = rset_make(LEN(dcontexts), ctx);
        }
        
        void dir_done(void)
        {
       -        reset_free(dir_rslr);
       -        reset_free(dir_rsrl);
       -        reset_free(dir_rsctx);
       +        rset_free(dir_rslr);
       +        rset_free(dir_rsrl);
       +        rset_free(dir_rsctx);
        }
 (DIR) diff --git a/reset.c b/reset.c
       t@@ -1,100 +0,0 @@
       -#include <regex.h>
       -#include <stdlib.h>
       -#include <stdio.h>
       -#include <string.h>
       -#include "vi.h"
       -
       -struct reset {
       -        regex_t regex;                /* the combined regular expression */
       -        int n;                        /* number of regular expressions in this set */
       -        int *grp;                /* the group assigned to each subgroup */
       -        int *setgrpcnt;                /* number of groups in each regular expression */
       -        int grpcnt;                /* group count */
       -};
       -
       -static int re_groupcount(char *s)
       -{
       -        int n = 0;
       -        while (*s) {
       -                if (s[0] == '(')
       -                        n++;
       -                if (s[0] == '\\' && s[1])
       -                        s++;
       -                s++;
       -        }
       -        return n;
       -}
       -
       -struct reset *reset_make(int n, char **re)
       -{
       -        struct reset *rs = malloc(sizeof(*rs));
       -        struct sbuf *sb = sbuf_make();
       -        int i;
       -        memset(rs, 0, sizeof(*rs));
       -        rs->grp = malloc((n + 1) * sizeof(rs->grp[0]));
       -        rs->setgrpcnt = malloc((n + 1) * sizeof(rs->setgrpcnt[0]));
       -        rs->grpcnt = 2;
       -        rs->n = n;
       -        sbuf_chr(sb, '(');
       -        for (i = 0; i < n; i++) {
       -                if (!re[i]) {
       -                        rs->grp[i] = -1;
       -                        rs->setgrpcnt[i] = 0;
       -                        continue;
       -                }
       -                if (sbuf_len(sb) > 1)
       -                        sbuf_chr(sb, '|');
       -                sbuf_chr(sb, '(');
       -                sbuf_str(sb, re[i]);
       -                sbuf_chr(sb, ')');
       -                rs->grp[i] = rs->grpcnt;
       -                rs->setgrpcnt[i] = re_groupcount(re[i]);
       -                rs->grpcnt += 1 + rs->setgrpcnt[i];
       -        }
       -        rs->grp[n] = rs->grpcnt;
       -        sbuf_chr(sb, ')');
       -        if (regcomp(&rs->regex, sbuf_buf(sb), REG_EXTENDED)) {
       -                free(rs->grp);
       -                free(rs->setgrpcnt);
       -                free(rs);
       -                sbuf_free(sb);
       -                return NULL;
       -        }
       -        sbuf_free(sb);
       -        return rs;
       -}
       -
       -int reset_find(struct reset *rs, char *s, int n, int *grps, int flg)
       -{
       -        regmatch_t *subs;
       -        int found, i, set = -1;
       -        if (rs->grpcnt <= 2)
       -                return -1;
       -        subs = malloc(rs->grpcnt * sizeof(subs[0]));
       -        found = !regexec(&rs->regex, s, rs->grpcnt, subs, 0);
       -        for (i = 0; found && i < rs->n; i++)
       -                if (rs->grp[i] >= 0 && subs[rs->grp[i]].rm_so >= 0)
       -                        set = i;
       -        if (found && set >= 0) {
       -                for (i = 0; i < n; i++) {
       -                        int grp = rs->grp[set] + i;
       -                        if (i < rs->setgrpcnt[set] + 1) {
       -                                grps[i * 2] = subs[grp].rm_so;
       -                                grps[i * 2 + 1] = subs[grp].rm_eo;
       -                        } else {
       -                                grps[i * 2 + 0] = -1;
       -                                grps[i * 2 + 1] = -1;
       -                        }
       -                }
       -        }
       -        free(subs);
       -        return set;
       -}
       -
       -void reset_free(struct reset *rs)
       -{
       -        regfree(&rs->regex);
       -        free(rs->setgrpcnt);
       -        free(rs->grp);
       -        free(rs);
       -}
 (DIR) diff --git a/rset.c b/rset.c
       t@@ -0,0 +1,102 @@
       +#include <regex.h>
       +#include <stdlib.h>
       +#include <stdio.h>
       +#include <string.h>
       +#include "vi.h"
       +
       +/* regular expression set */
       +struct rset {
       +        regex_t regex;                /* the combined regular expression */
       +        int n;                        /* number of regular expressions in this set */
       +        int *grp;                /* the group assigned to each subgroup */
       +        int *setgrpcnt;                /* number of groups in each regular expression */
       +        int grpcnt;                /* group count */
       +};
       +
       +static int re_groupcount(char *s)
       +{
       +        int n = 0;
       +        while (*s) {
       +                if (s[0] == '(')
       +                        n++;
       +                if (s[0] == '\\' && s[1])
       +                        s++;
       +                s++;
       +        }
       +        return n;
       +}
       +
       +struct rset *rset_make(int n, char **re)
       +{
       +        struct rset *rs = malloc(sizeof(*rs));
       +        struct sbuf *sb = sbuf_make();
       +        int i;
       +        memset(rs, 0, sizeof(*rs));
       +        rs->grp = malloc((n + 1) * sizeof(rs->grp[0]));
       +        rs->setgrpcnt = malloc((n + 1) * sizeof(rs->setgrpcnt[0]));
       +        rs->grpcnt = 2;
       +        rs->n = n;
       +        sbuf_chr(sb, '(');
       +        for (i = 0; i < n; i++) {
       +                if (!re[i]) {
       +                        rs->grp[i] = -1;
       +                        rs->setgrpcnt[i] = 0;
       +                        continue;
       +                }
       +                if (sbuf_len(sb) > 1)
       +                        sbuf_chr(sb, '|');
       +                sbuf_chr(sb, '(');
       +                sbuf_str(sb, re[i]);
       +                sbuf_chr(sb, ')');
       +                rs->grp[i] = rs->grpcnt;
       +                rs->setgrpcnt[i] = re_groupcount(re[i]);
       +                rs->grpcnt += 1 + rs->setgrpcnt[i];
       +        }
       +        rs->grp[n] = rs->grpcnt;
       +        sbuf_chr(sb, ')');
       +        if (regcomp(&rs->regex, sbuf_buf(sb), REG_EXTENDED)) {
       +                free(rs->grp);
       +                free(rs->setgrpcnt);
       +                free(rs);
       +                sbuf_free(sb);
       +                return NULL;
       +        }
       +        sbuf_free(sb);
       +        return rs;
       +}
       +
       +/* return the index of the matching regular expression or -1 if none matches */
       +int rset_find(struct rset *rs, char *s, int n, int *grps, int flg)
       +{
       +        regmatch_t *subs;
       +        int found, i, set = -1;
       +        if (rs->grpcnt <= 2)
       +                return -1;
       +        subs = malloc(rs->grpcnt * sizeof(subs[0]));
       +        found = !regexec(&rs->regex, s, rs->grpcnt, subs, 0);
       +        for (i = 0; found && i < rs->n; i++)
       +                if (rs->grp[i] >= 0 && subs[rs->grp[i]].rm_so >= 0)
       +                        set = i;
       +        if (found && set >= 0) {
       +                for (i = 0; i < n; i++) {
       +                        int grp = rs->grp[set] + i;
       +                        if (i < rs->setgrpcnt[set] + 1) {
       +                                grps[i * 2] = subs[grp].rm_so;
       +                                grps[i * 2 + 1] = subs[grp].rm_eo;
       +                        } else {
       +                                grps[i * 2 + 0] = -1;
       +                                grps[i * 2 + 1] = -1;
       +                        }
       +                }
       +        }
       +        free(subs);
       +        return set;
       +}
       +
       +void rset_free(struct rset *rs)
       +{
       +        regfree(&rs->regex);
       +        free(rs->setgrpcnt);
       +        free(rs->grp);
       +        free(rs);
       +}
 (DIR) diff --git a/vi.h b/vi.h
       t@@ -37,9 +37,9 @@ int sbuf_len(struct sbuf *sb);
        void sbuf_cut(struct sbuf *s, int len);
        
        /* regular expression sets */
       -struct reset *reset_make(int n, char **pat);
       -int reset_find(struct reset *re, char *s, int n, int *grps, int flg);
       -void reset_free(struct reset *re);
       +struct rset *rset_make(int n, char **pat);
       +int rset_find(struct rset *re, char *s, int n, int *grps, int flg);
       +void rset_free(struct rset *re);
        
        /* rendering lines */
        int *ren_position(char *s);