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); |