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