Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.