| trset: rename from reset - neatvi - [fork] simple vi-type editor with UTF-8 sup… | |
| git clone git://src.adamsgaard.dk/neatvi | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 3a7a3bacd46ef3477daae02cddff1c18bf0a2658 | |
| parent 4b1b940dae17628b3ae84a84ae69d76df471662b | |
| Author: Ali Gholami Rudi <[email protected]> | |
| 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(-) | |
| --- | |
| 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 | |
| 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 str… | |
| +static struct rset *dir_rsrl; /* pattern of marks for right-to-left str… | |
| +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 ct… | |
| 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); | |
| } | |
| 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… | |
| - int *grp; /* the group assigned to each subgroup */ | |
| - int *setgrpcnt; /* number of groups in each regular exp… | |
| - 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); | |
| -} | |
| 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… | |
| + int *grp; /* the group assigned to each subgroup */ | |
| + int *setgrpcnt; /* number of groups in each regular exp… | |
| + 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); | |
| +} | |
| 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); |