tregex: updates from neatlibc - 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 c90511855c86607fc0f66d88f2a306730d2138c9
(DIR) parent a8b14d8f0ccab1346466bbf91380d80d226171f6
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Wed, 30 Sep 2020 20:13:32 +0330
regex: updates from neatlibc
Diffstat:
M regex.c | 40 +++++++++++++++++++++----------
1 file changed, 27 insertions(+), 13 deletions(-)
---
(DIR) diff --git a/regex.c b/regex.c
t@@ -41,8 +41,8 @@ struct ratom {
/* regular expression instruction */
struct rinst {
- int ri; /* instruction type (RI_*) */
struct ratom ra; /* regular expression atom (RI_ATOM) */
+ int ri; /* instruction type (RI_*) */
int a1, a2; /* destination of RI_FORK and RI_JUMP */
int mark; /* mark (RI_MARK) */
};
t@@ -51,26 +51,26 @@ struct rinst {
struct regex {
struct rinst *p; /* the program */
int n; /* number of instructions */
- int grpcnt; /* number of groups */
int flg; /* regcomp() flags */
};
/* regular expression matching state */
struct rstate {
- int mark[NGRPS * 2]; /* marks for RI_MARK */
- int pc; /* program counter */
char *s; /* the current position in the string */
char *o; /* the beginning of the string */
+ int mark[NGRPS * 2]; /* marks for RI_MARK */
+ int pc; /* program counter */
int flg; /* flags passed to regcomp() and regexec() */
int dep; /* re_rec() depth */
};
/* regular expression tree; used for parsing */
struct rnode {
- int rn; /* node type (RN_*) */
struct ratom ra; /* regular expression atom (RN_ATOM) */
- int mincnt, maxcnt; /* number of repetitions */
struct rnode *c1, *c2; /* children */
+ int mincnt, maxcnt; /* number of repetitions */
+ int grp; /* group number */
+ int rn; /* node type (RN_*) */
};
static struct rnode *rnode_make(int rn, struct rnode *c1, struct rnode *c2)
t@@ -307,13 +307,15 @@ static struct rnode *rnode_parse(char **pat);
static struct rnode *rnode_grp(char **pat)
{
- struct rnode *rnode;
+ struct rnode *rnode = NULL;
if ((*pat)[0] != '(')
return NULL;
*pat += 1;
- rnode = rnode_parse(pat);
- if (!rnode)
- return NULL;
+ if ((*pat)[0] != ')') {
+ rnode = rnode_parse(pat);
+ if (!rnode)
+ return NULL;
+ }
if ((*pat)[0] != ')') {
rnode_free(rnode);
return NULL;
t@@ -418,6 +420,18 @@ static int rnode_count(struct rnode *rnode)
return n;
}
+static int rnode_grpnum(struct rnode *rnode, int num)
+{
+ int cur = 0;
+ if (!rnode)
+ return 0;
+ if (rnode->rn == RN_GRP)
+ rnode->grp = num + cur++;
+ cur += rnode_grpnum(rnode->c1, num + cur);
+ cur += rnode_grpnum(rnode->c2, num + cur);
+ return cur;
+}
+
static int re_insert(struct regex *p, int ri)
{
p->p[p->n++].ri = ri;
t@@ -443,12 +457,11 @@ static void rnode_emitnorep(struct rnode *n, struct regex *p)
rnode_emit(n->c2, p);
}
if (n->rn == RN_GRP) {
- int grp = p->grpcnt++ + 1;
mark = re_insert(p, RI_MARK);
- p->p[mark].mark = 2 * grp;
+ p->p[mark].mark = 2 * n->grp;
rnode_emit(n->c1, p);
mark = re_insert(p, RI_MARK);
- p->p[mark].mark = 2 * grp + 1;
+ p->p[mark].mark = 2 * n->grp + 1;
}
if (n->rn == RN_ATOM) {
int atom = re_insert(p, RI_ATOM);
t@@ -503,6 +516,7 @@ int regcomp(regex_t *preg, char *pat, int flg)
int mark;
if (!rnode)
return 1;
+ rnode_grpnum(rnode, 1);
re = malloc(sizeof(*re));
memset(re, 0, sizeof(*re));
re->p = malloc(n * sizeof(re->p[0]));